永久代是否总是在HotSpot VM上串行收集?

时间:2013-12-08 12:22:05

标签: java garbage-collection jvm-hotspot

从阅读a rather mature Oracle blog entry开始,我了解到了

  

(...)目前正在连续收集永久世代。

然而,这篇博客文章来自几年前,我想知道垃圾收集算法的最新进展可能如何改变了这种说法的准确性。我特别想知道新的G1垃圾收集器desribed by Oracle与:

  

旧的垃圾收集器(串行,并行,CMS)都构成了   分为三个部分:年轻一代,老一代,和   永久生成固定内存大小。 (......)   执行垃圾收集时,G1以类似的方式运行   到CMS收藏家。

但从未在整个教程中再次提及永久性一代。

从阅读有关CMS的内容 - 根据上述陈述与G1类似 - 我没有找到关于永久世代的任何明确信息,但是从这个other blog entry中学到了

  

(...)并发标记和扫描根本不紧凑。一旦对象   无法再分配串行主要GC被触发。

所以我想知道现代垃圾收集器,例如CMS或G1,是否完全忽略永久生成并将其留给完整GC 调用,这些调用运行旧的串行GC以清除永久生成(虽然这个系列GC也连续收集年轻和成熟的世代,当使用G1代替CMS时,我不理解这是不可取的)。我主要想知道在STW和收集时间方面对永久世代进行垃圾收集是否比收集终身一代更加昂贵。

奖金问题:Oracle教程提到永久生成是堆的一部分。我一直认为永久生成是在堆外明确分配的。在最近的HotSpot实现中这是否发生了变化?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

有一个JEP156关于使G1能够在没有完整GC的情况下卸载类,但依赖部分声明等待[JEP122]直到永久生成是有意义的使JEP156更容易实现。

所以看起来这个问题确实可以在Java 8中解决,但不仅仅是因为元空间,而是因为元空间被视为进行类增量GC的先决条件。

这是我的理解。

编辑:在过去的几天里,我一直在听一些今年的JavaOne会议,幸运的是我今天发现了一个关于PermGen removal的所有内容:

  • HotSpot目前需要完整的GC来收集PermGen
  • 即使在引入Metaspace后仍然如此
  • 最后的摘要幻灯片似乎证实JEP156仍在计划中(但她没有谈论它)
  • 它甚至回答了我得到答案但没有来源的奖金问题:是的,PermGen在堆中