通过阅读相当成熟的Oracle博客文章,我了解到了这一点
(......)目前正在连续收集永久性一代.
然而,这篇博客文章来自几年前,我想知道垃圾收集算法的最新进展如何可能改变了这种说法的准确性.我特别想知道甲骨文所描述的新的G1垃圾收集器:
旧的垃圾收集器(串行,并行,CMS)都将堆构建为三个部分:年轻代,旧代和永久生成固定内存大小.(...)执行垃圾收集时,G1以类似于CMS收集器的方式运行.
但是再也没有在整个教程中提到永久代.
从阅读有关CMS - 根据上述声明的工作方式类似于G1 - 我没有找到关于永久世代的任何明确信息,但从其他博客条目中了解到
(...)Concurrent Mark和Sweep根本不紧凑.一旦无法再分配对象,就会触发串行主GC.
因此,我想知道现代垃圾收集器,例如CMS或G1,是否完全忽略了永久性生成并将其留给完整的GC调用,这些调用运行旧的串行GC以清除永久代(同时此序列GC也收集年轻和连续成熟的世代,当使用G1代替CMS时,我不理解这是不可取的.我主要想知道在STW和收集时间方面对永久代进行垃圾收集是否比收集终生代更加昂贵.
奖金问题:Oracle教程提到永久生成是堆的一部分.我一直认为永久生成是在堆外明确分配的.最近的HotSpot实现中是否有此更改?
谢谢您的帮助!