从阅读一篇相当成熟的Oracle博客文章中,我了解到:
(...) 永久代目前是串行收集的。
然而,这篇博客文章是几年前的,我想知道垃圾回收算法的最新进展如何改变了这个说法的准确性。我特别想知道新的G1垃圾收集器,它被Oracle描述为:
旧的垃圾收集器(串行、并行、CMS)都将堆结构化为三个部分:固定内存大小的年轻代、老年代和永久代。(...)在执行垃圾收集时,G1的操作方式类似于CMS收集器。
但整个教程中从未提到过永久代。
阅读有关CMS的内容-根据上述声明,它的工作方式类似于G1-我没有找到有关永久代的明确信息,但从这篇其他博客文章中了解到:(...)并发标记和清除根本不压缩。一旦对象不能再分配,就会触发串行主GC。
因此,我想知道现代垃圾收集器(如CMS或G1)是否完全忽略了永久代,并将其留给full GC调用来清理永久代(而此串行GC也按顺序收集年轻代和成熟代,我认为如果使用CMS而不是G1,则不应该这样做)。我主要想知道在STW和收集时间方面,对永久代进行垃圾回收是否比对老年代进行垃圾回收更昂贵。 奖励问题:Oracle教程提到永久代是堆的一部分。我一直认为永久代是在堆之外显式分配的。这在最近的HotSpot实现中有所改变吗?
谢谢您的帮助!