G1垃圾收集 永久代和MetaSpace

时间:2022-04-12 23:02:11

翻译https://blogs.oracle.com/poonam/entry/about_g1_garbage_collector_permanent

G1垃圾收集 永久代和MetaSpace

JDK7: 永久代

在JDK7中,永久代一直存在,只是此时已经开始移除其中的部分内容了

  • 符号引用(Symbols) 移动到native heap;
  • 字面量(interned strings)移动到java heap;
  • 类的静态变量(class statics)移动到了java heap。

JDK7: G1 and 永久代

对于G1,永久代只会被FULL GC回收。G1只会在两种情况下调用Full GC,FullGC是Stop-the-world(STW) GC.

  • 永久代满了
  • 应用程序分配内存的速度大于G1并发收集的速度(concurrently collect garbage)

对于CMS,可以使用 -XX:+CMSClassUnloadingEnabled 选项,在CMS并发循环(concurrent cycle)中收集,这和G1不同,G1只会在Full Stop-the-world(STW) GC时收集。

我们可以使用-XX:PermSize 和 -XX:MaxPermSize选项来分别设置永久代的大小和永久代的最大值。

JDK8:永久代

永久代在JDK8中已经被完全移除了。-XX:PermSize 和 -XX:MaxPermSize选项会被忽略。

JDK8:元空间(MetaSpace)

类的元数据(classes metadata),被存储在本地堆中(native heap),这个地方就叫做MetaSpace。同时为MetaSpace增加了新的Flag

  • -XX:MetaspaceSize 初始化元空间的大小(默认12Mbytes在32bit client VM and 16Mbytes 在32bit server VM,在64bit VM上会更大些)
  • -XX:MaxMetaspaceSize 最大元空间的大小(默认本地内存)
  • -XX:MinMetaspaceFreeRatio 扩大空间的最小比率,当GC后,内存占用超过这一比率,就会扩大空间
  • -XX:MaxMetaspaceFreeRatio 缩小空间的最小比率,当GC后,内存占用低于这一比率,就会缩小空间

默认的Metaspace只会受限于本地内存大小。当Metaspace到达MetaspaceSize的当前大小时,就会触发GC。当然你可以设置MetaspaceSize一个更大的值来延迟触发GC。

更多更详细的关于Metaspace
http://www.infoq.com/articles/Java-PERMGEN-Removed
译文:
http://ifeve.com/java-permgen-removed/