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

Raf*_*ter 9 java garbage-collection jvm-hotspot

通过阅读相当成熟的Oracle博客文章,我了解到了这一点

(......)目前正在连续收集永久性一代.

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

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

但是再也没有在整个教程中提到永久代.

从阅读有关CMS - 根据上述声明的工作方式类似于G1 - 我没有找到关于永久世代的任何明确信息,但从其他博客条目中了解到

(...)Concurrent Mark和Sweep根本不紧凑.一旦无法再分配对象,就会触发串行主GC.

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

奖金问题:Oracle教程提到永久生成是堆的一部分.我一直认为永久生成是在堆外明确分配的.最近的HotSpot实现中是否有此更改?

谢谢您的帮助!

Dji*_*eus 3

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

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

这是我的理解。

编辑:在过去的几天里,我一直在听今年的一些 JavaOne 会议,很幸运,我今天发现了一个关于PermGen 删除的会议,它说明了一切:

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