在Java8和之后版本中JVM的内存结构慢慢发生了变化。做为面试官若是你还不知道,那么面试过程当中是否是有些露怯?做为面试者,若是知晓这些变化,又将成为面试中的亮点。java
若是在网络上搜索JVM内存结构,90%的可能会搜到Java7及之前的内存图,本篇文章将会对JVM内存结构再次细化,深刻理解Java8以后的内部变化。如今意×××”的好处了吧。在这里能够不断的刷新你的知识和认知。程序员
来看一下JVM中的内存结构图。面试
为了更细化的讲解,咱们将该图进行进一步的优化调整。针对java7及之前版本的细化。安全
看出变化了吗?堆和方法区连在了一块儿,但这并不能说堆和方法区是一块儿的,它们在逻辑上依旧是分开的。但在物理上来讲,它们又是连续的一块内存。也就是说,方法区和前面讲到的Eden和老年代是连续的。网络
在继续进行下去以前,咱们先来理解两个概念:规范和实现。运维
针对Java虚拟机的实现有专门的《Java虚拟机规范》,在遵照规范的前提下,不一样的厂商会对虚拟机进行不一样的实现。 就比如开发的过程当中定义了接口,具体的接口实现你们能够根据不一样的业务需求进行实现。ide
PS:你们都有必要了解一下《Java虚拟机规范×××”,回复“002”得到Java SE 7的虚拟机规范PDF版。性能
咱们一般使用的Java SE都是由Sun JDK和OpenJDK所提供,这也是应用最普遍的版本。而该版本使用的VM就是HotSpot VM。一般状况下,咱们所讲的java虚拟机指的就是HotSpot的版本。测试
上面理解了规范和实现以后,来看认识一个概念“永久代(Permanet Generation,也称PermGen)”。对于习惯了在HotSpot虚拟机上开发、部署的程序员来讲,不少都愿意将方法区称做永久代。优化
本质上来说二者并不等价,仅由于Hotspot将GC分代扩展至方法区,或者说使用永久代来实现方法区。在其余虚拟机上是没有永久代的概念的。也就是说方法区是规范,永久代是Hotspot针对该规范进行的实现。
理解上面的概念以后,咱们对Java7及之前版本的堆和方法区的构造再进行一下变更。
再重复一遍就是对Java7及之前版本的Hotspot中方法区位于永久代中。同时,永久代和堆是相互隔离的,但它们使用的物理内存是连续的。
永久代的垃圾收集是和老年代捆绑在一块儿的,所以不管谁满了,都会触发永久代和老年代的垃圾收集。
但在Java7中永久代中存储的部分数据已经开始转移到Java Heap或Native Memory中了。好比,符号引用(Symbols)转移到了Native Memory;字符串常量池(interned strings)转移到了Java Heap;类的静态变量(class statics)转移到了Java Heap。
而后,在Java8中,时代变了,Hotspot取消了永久代。永久代真的成了永久的记忆。永久代的参数-XX:PermSize和-XX:MaxPermSize也随之失效。
对于Java8,HotSpots取消了永久代,那么是否是就没有方法区了呢?固然不是,方法区只是一个规范,只不过它的实现变了。
在Java8中,元空间(Metaspace)登上舞台,方法区存在于元空间(Metaspace)。同时,元空间再也不与堆连续,并且是存在于本地内存(Native memory)。
本地内存(Native memory),也称为C-Heap,是供JVM自身进程使用的。当Java Heap空间不足时会触发GC,但Native memory空间不够却不会触发GC。
针对Java8的调整,咱们再次对内存结构图进行调整。
元空间存在于本地内存,意味着只要本地内存足够,它不会出现像永久代中“java.lang.OutOfMemoryError: PermGen space”这种错误。看上图中的方法区,是否是“膨胀”了。
默认状况下元空间是能够无限使用本地内存的,但为了避免让它如此膨胀,JVM一样提供了参数来限制它使用的使用。
思考一下,为何使用元空间替换永久代?
表面上看是为了不OOM异常。由于一般使用PermSize和MaxPermSize设置永久代的大小就决定了永久代的上限,可是不是总能知道应该设置为多大合适, 若是使用默认值很容易遇到OOM错误。
当使用元空间时,能够加载多少类的元数据就再也不由MaxPermSize控制, 而由系统的实际可用空间来控制。
更深层的缘由仍是要合并HotSpot和JRockit的代码,JRockit历来没有所谓的永久代,也不须要开发运维人员设置永久代的大小,可是运行良好。同时也不用担忧运行性能问题了,在覆盖到的测试中, 程序启动和运行速度下降不超过1%,可是这点性能损失换来了更大的安全保障。
通过上面的讲解和演变,是否是对JVM的内存结构有了更深的理解了?能够和面试官多聊一下子了,毕竟面试官的时间也很少了。