`

JVM的持久代——何去何从?

 
阅读更多

本文会介绍一些JVM内存结构的基本概念,然后很快会讲到持久代,来看下Java SE 8发布后它究竟到哪去了。 

基础知识 

JVM只不过是运行在你系统上的另一个进程而已,这一切的魔法始于一个java命令。正如任何一个操作系统进程那样,JVM也需要内存来完成它的运行时操作。记住——JVM本身是硬件的一层软件抽象,在这之上才能够运行Java程序,也才有了我们所吹嘘的平台独立性以及WORA(一次编写,处处运行)。 

快速过一遍JVM的内存结构 

正如虚拟机规范所说的那样,JVM中的内存分为5个虚拟的区域。 

  • 方法区(非堆)
  • JVM栈
  • 本地栈
  • PC寄存器


     
  • 你的Java程序中所分配的每一个对象都需要存储在内存里。堆是这些实例化的对象所存储的地方。是的——都怪new操作符,是它把你的Java堆都占满了的!
  • 它由所有线程共享
  • 当堆耗尽的时候,JVM会抛出java.lang.OutOfMemoryError 异常
  • 堆的大小可以通过JVM选项-Xms和-Xmx来进行调整
     

    堆被分为: 
  • Eden区 —— 新对象或者生命周期很短的对象会存储在这个区域中,这个区的大小可以通过-XX:NewSize和-XX:MaxNewSize参数来调整。新生代GC(垃圾回收器)会清理这一区域。
  • Survivor区 —— 那些历经了Eden区的垃圾回收仍能存活下来的依旧存在引用的对象会待在这个区域。这个区的大小可以由JVM参数-XX:SurvivorRatio来进行调节。
  • 老年代 —— 那些在历经了Eden区和Survivor区的多次GC后仍然存活下来的对象(当然了,是拜那些挥之不去的引用所赐)会存储在这个区里。这个区会由一个特殊的垃圾回收器来负责。年老代中的对象的回收是由老年代的GC(major GC)来进行的。
    方法区 
  • 也被称为非堆区域(在HotSpot JVM的实现当中)
  • 它被分为两个主要的子区域
    持久代 —— 这个区域会存储包括类定义,结构,字段,方法(数据及代码)以及常量在内的类相关数据。它可以通过-XX:PermSize及-XX:MaxPermSize来进行调节。如果它的空间用完了,会导致java.lang.OutOfMemoryError: PermGen space的异常。 

    代码缓存——这个缓存区域是用来存储编译后的代码。编译后的代码就是本地代码(硬件相关的),它是由JIT(Just In Time)编译器生成的,这个编译器是Oracle HotSpot JVM所特有的。 

    JVM栈 
  • 和Java类中的方法密切相关
  • 它会存储局部变量以及方法调用的中间结果及返回值
  • Java中的每个线程都有自己专属的栈,这个栈是别的线程无法访问的。
  • 可以通过JVM选项-Xss来进行调整
    本地栈 
  • 用于本地方法(非Java代码)
  • 按线程分配
    PC寄存器 
  • 特定线程的程序计数器
  • 包含JVM正在执行的指令的地址(如果是本地方法的话它的值则未定义)
    好吧,这就是JVM内存分区的基础知识了。现在再说说持久代这个话题吧。 

    那么持久代上哪去了? 

    事实上,持久代已经被彻底删除了,取代它的是另一个内存区域也被称为元空间。 

    元空间 —— 快速入门 
  • 它是本地堆内存中的一部分
  • 它可以通过-XX:MetaspaceSize和-XX:MaxMetaspaceSize来进行调整
  • 当到达XX:MetaspaceSize所指定的阈值后会开始进行清理该区域
  • 如果本地空间的内存用尽了会收到java.lang.OutOfMemoryError: Metadata space的错误信息。
  • 和持久代相关的JVM参数-XX:PermSize及-XX:MaxPermSize将会被忽略掉。
    当然了,这只是冰山一角。想要更深入地了解JVM,最好的资料莫过于它自己的虚拟机规范了! 

    更多文章请移步我的个人博客:Java译站 



    原创文章转载请注明出处:http://it.deepinmind.com 



    英文原文链接
分享到:
评论

相关推荐

    什么是Java虚拟机(JVM)?——–回过头来看

    什么是Java虚拟机(JVM)?——–回过头来看 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 简介 Java虚拟机(Java Virtual Machine ...

    JVM——总结思维导图

    JVM——总结思维导图

    实战Java虚拟机——JVM故障诊断与性能优化 pdf

    《实战Java虚拟机——JVM故障诊断与性能优化》内容简介:随着越来越多的第三方语言(Groovy、Scala、JRuby等)在Java虚拟机上运行,Java也俨然成为一个充满活力的生态圈。本书将通过200余示例详细介绍Java虚拟机中的...

    实战Java虚拟机——JVM故障诊断与性能优化.pdf

    《实战Java虚拟机——JVM故障诊断与性能优化》是一本深入探讨Java开发中的关键环节——Java虚拟机(JVM)的专著。本书聚焦于实际应用中的问题解决和性能调优,对于Java开发者和系统管理员来说,是提升技术水平的重要...

    JVM.zip_JVM代理_classloader

    Java提供了一种标准接口——`java.lang.instrument.Instrumentation`,开发者可以通过这个接口来创建自己的代理,实现对字节码的动态操作。 在Java中,有两种主要的代理技术:静态代理和动态代理。静态代理是在编译...

    jdk1.8的jvm内存模型——实习生必须了解的

    在JDK 1.8之前,这部分被称为永久代(Permanent Generation),但在1.8及以后,被替换为元空间(Metaspace),存储在本地内存中,不受JVM内存限制,可以通过参数调整大小。 6. **运行时常量池**: - 运行时常量池...

    实战Java虚拟机——JVM故障诊断与性能优化

    《实战Java虚拟机——JVM故障诊断与性能优化》是一本深入探讨Java开发人员和运维人员必备技能的书籍。本书作者葛一鸣以其丰富的实战经验,详细阐述了JVM(Java Virtual Machine)的工作原理,以及如何有效地进行故障...

    java未来发展——JVM7

    【Java未来发展——JVM7】 Java作为一门广泛使用的编程语言,其未来发展一直是开发者关注的焦点。JVM(Java虚拟机)作为Java平台的核心,它的每一次重大更新都会对Java生态系统产生深远影响。JVM7,即Java 7,是...

    JVM夺命连环问面试题分享给需要的同学.docx

    讲一讲JVM中的分代模型 讲一讲CMS垃圾回收器 讲一讲G1垃圾回收器 JVM的运行时数据区有哪些? 什么是堆空间?堆内存包含哪些部分? 什么是内存溢出? 什么是内存泄漏?与内存溢出有什么关系? 对象包含哪些部分? ...

    A-JVM-Does-What-Cliff Click.pdf

    A JVM Does That??? A JVM Does That???是 Cliff Click 在 Azul Systems 博客上分享的一篇技术文档,讨论了 JVM 的服务和功能。本文档中,Cliff Click 作为一名经验丰富的 JVM 工程师,对 JVM 的服务和功能进行了...

    JVM常见面试题.pdf

    针对 Java 程序员学习 JVM 的 60 道面试题: 1. **JVM 的作用是什么?** 2. **JVM 的内存结构可分为哪几部分?请描述每个部分。** 3. **什么是垃圾回收(Garbage Collection)?JVM 是如何进行垃圾回收的?** 4. **...

    JVM内存溢出问题解析

    JVM 内存溢出问题解析 JVM 内存溢出是指程序运行所需的内存大于虚拟机能提供的最大内存的情况。这种情况可能是由于数据量过大、死循环、静态变量和静态方法过多、递归、无法确定是否被引用的对象等原因引起的。同时...

    全套JVM面试题!面试必备!

    【JVM面试题详解】 Java虚拟机(JVM)是Java平台的核心组成部分,它负责运行Java应用程序并提供跨平台的兼容性。对于Java开发者来说,深入理解JVM的工作原理是面试中不可或缺的一部分。以下是一些关于JVM的常见面试...

    【JVM】灵性一问——为什么用元空间替换永久代?

    【JVM】灵性一问——为什么用元空间替换永久代? 在Java的虚拟机(JVM)设计中,HotSpot虚拟机曾经采用了一个名为“永久代”的内存区域,用于存储类元数据,如类信息、常量、静态变量等。然而,自Java 8开始,...

    JVM性能调优-JVM内存整理及GC回收.pdf_java_jvm_

    《JVM性能调优——JVM内存整理及GC回收》是针对Java开发人员的重要主题,尤其是在大型企业级应用中,确保JVM(Java虚拟机)的高效运行是至关重要的。本资料深入探讨了如何通过调整JVM内存设置和优化垃圾回收机制来...

    学习笔记——JVM性能调优之 jstat(csdn)————程序.pdf

    JVM性能调优是Java开发中至关重要的一环,它直接影响应用程序的运行效率和稳定性。jstat(JVM Statistics Monitoring Tool)是Oracle JDK提供的一款强大的命令行工具,用于实时监控Java虚拟机的各种运行状态,包括...

    java jvm-old gc耗时几十s,导致系统告警(csdn)————程序.pdf

    在Java应用程序中,JVM(Java虚拟机)的垃圾收集(Garbage Collection, GC)是自动管理内存的关键机制。当对象不再被引用时,GC负责回收这些无用的对象所占用的内存空间,以避免内存泄漏。然而,如果GC过程耗时过长...

    【JVM】类的奇幻漂流——类加载机制探秘

    【JVM】类的奇幻漂流——类加载机制探秘 Java虚拟机(JVM)是运行Java程序的核心组件,它负责将我们编写的类加载到内存中并执行。类加载机制是JVM的一个重要组成部分,它确保了程序的正常运行。本文将带你深入理解...

    JVM调优工具分享

    本文将详细介绍两款常用的JVM调优工具——JConsole和VisualVM。 首先,JConsole是Java 5及更高版本JDK自带的一款监控和管理控制台。它基于JMX(Java Management Extensions),提供了图形用户界面来监控JVM中的内存...

Global site tag (gtag.js) - Google Analytics