方法区与永久代
提及java内存区域时,我们总会想到堆、栈、方法区等,堆中会分为年轻代和老年代,方法区则往往会与永久代挂钩,那么永久代和方法区到底是什么关系呢?《Java虚拟机规范》只是规定了有方法区这么个概念和它的作用(保存类信息、常量、静态变量、即时编译器编译后的代码等数据),并没有规定如何去实现它。那么,在不同的 JVM 上方法区的实现肯定是不同的了。 同时大多数用的JVM都是Sun公司的HotSpot。在HotSpot上把GC分代收集扩展至方法区,或者说使用永久代来实现方法区。因此,我们得到了结论,永久代是HotSpot的概念,方法区是Java虚拟机规范中的定义,是一种规范,而永久代是一种实现,一个是标准一个是实现。其他的虚拟机实现并没有永久带这一说法。在1.7之前在(JDK1.2 ~ JDK6)的实现中,HotSpot 使用永久代实现方法区,并把 GC分代收集扩展至方法区。我们可以使用如下参数来调节方法区的大小:
-XX:PermSize
方法区初始大小
-XX:MaxPermSize
方法区最大大小
超过这个值将会抛出OutOfMemoryError异常:java.lang.OutOfMemoryError: PermGen
JDK 1.7 中永久代的变化
上边已经提到,方法区的主要作用是保存类信息(如类名,访问修饰符,字段描述,方法描述等)、常量、静态变量、即时编译器编译后的代码等数据。HotSpot在 JDK 1.7 中依然存在永久代概念,但 JDK 1.7 已经把原本放在永久代中的字符串常量池移除,放置到了堆内存中。官网解释如下:
Area: HotSpot
Synopsis: In JDK 7, interned strings are no longer allocated in the permanent generation of the Java heap, but are instead allocated in the main part of the Java heap (known as the young and old generations), along with the other objects created by the application. This change will result in more data residing in the main Java heap, and less data in the permanent generation, and thus may require heap sizes to be adjusted. Most applications will see only relatively small differences in heap usage due to this change, but larger applications that load many classes or make heavy use of the String.intern() method will see more significant differences.
RFE: 6962931
java8 中永久代的消除
在jdk1.8中,HotSpot 不再使用永久代来实现方法区了,存储的类信息、编译后的代码数据等已经移动到了元空间(MetaSpace)中,元空间并没有处于堆内存上,而是直接占用的本地内存(NativeMemory)。
元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制,但可以通过以下参数来指定元空间的大小:
-XX:MetaspaceSize,初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过 MaxMetaspaceSize 时,适当提高该值。
-XX:MaxMetaspaceSize,最大空间,默认是没有限制的。
除了上面两个指定大小的选项以外,还有两个与 GC 相关的属性:
-XX:MinMetaspaceFreeRatio,在GC之后,最小的 Metaspace 剩余空间容量的百分比,减少为分配空间所导致的垃圾收集;
-XX:MaxMetaspaceFreeRatio,在GC之后,最大的 Metaspace 剩余空间容量的百分比,减少为释放空间所导致的垃圾收集;
参考
-
《深入理解java虚拟机 第三版》
-
Jvm 系列(二):Jvm 内存结构(主要关注评论区)
来源:oschina
链接:https://my.oschina.net/u/3529605/blog/4436959