java常见面试考点
往期文章推荐:
java常见面试考点(十二):new一个对象和clone一个对象的区别
java常见面试考点(十三):抽象类与接口的区别
java常见面试考点(十四):redis持久化
java常见面试考点(十五):什么时候建索引
java常见面试考点(十六):类加载器的常见考点
【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权);
本博客的内容来自于:java常见面试考点(十七):为什么要去除永久代,换成元空间;
学习、合作与交流联系q384660495;
本博客的内容仅供学习与参考,并非营利;
一、前言
《Java虚拟机规范》只是规定了有方法区这么个概念和它的作用,并没有规定如何去实现它。那么,在不同的 JVM 上方法区的实现肯定是不同的了。 同时大多数用的JVM都是Sun公司的HotSpot。在HotSpot上把GC分代收集扩展至方法区,或者说使用永久代来实现方法区。因此,我们得到了结论,永久代是HotSpot的概念,方法区是Java虚拟机规范中的定义,是一种规范,而永久代是一种实现,一个是标准一个是实现。其他的虚拟机实现并没有永久带这一说法。在1.7之前在(JDK1.2 ~ JDK6)的实现中,HotSpot 使用永久代实现方法区,HotSpot 使用 GC分代来实现方法区内存回收。
二、永久代
首先,认识一个概念:永久代(Permanet Generation,也称PermGen)。对于习惯了在HotSpot虚拟机上开发、部署的程序员来说,很多都愿意将方法区称作永久代。

本质上来讲两者并不等价,仅因为Hotspot将GC分代扩展至方法区,或者说使用永久代来实现方法区。在其他虚拟机上是没有永久代的概念的。也就是说方法区是规范,永久代是Hotspot针对该规范进行的实现。
理解上面的概念之后,我们对Java7及以前版本的堆和方法区的构造再进行一下变动。
Java7及以前版本的Hotspot中方法区位于永久代中。同时,永久代和堆是相互隔离的,但它们使用的物理内存是连续的。
永久代的垃圾收集是和老年代捆绑在一起的,因此无论谁满了,都会触发永久代和老年代的垃圾收集。
但在Java7中永久代中存储的部分数据已经开始转移到Java Heap或Native Memory中了。比如,符号引用(Symbols)转移到了Native Memo

本文探讨了Java8中移除永久代的原因,引入了元空间作为方法区的新实现。永久代由于空间大小难以确定和调优困难被替换。元空间位于本地内存,允许更灵活的内存管理,减少OOM风险。此外,解释了StringTable存储在堆中的理由,以实现更高效的内存回收。
最低0.47元/天 解锁文章
6511





