通过阅读一个相当成熟的Oracle博客条目,我了解到
(...)永久世代目前是按顺序收集的。
然而,这篇博客文章是几年前写的,我想知道最近垃圾收集算法的进步如何改变了这一说法的准确性。我特别想知道新的G1垃圾收集器,它是甲骨文和:
旧的垃圾收集器(串行、并行、CMS)都将堆构造为三个部分:年轻代、老代和固定内存大小的永久代。(...)在执行垃圾回收时,G1的操作方式类似于CMS收集器。
但不要在整个教程中再次提到永久一代。
通过阅读有关CMS的文章--根据上面的声明,这与G1相似--我也没有找到任何关于永久世代的明确信息,但从这个其他博客条目中了解到
(...)同时标记和扫描一点也不紧凑。一旦不能再分配对象,就会触发串行主GC。
因此,我想知道,现代垃圾收集器(如CMS或G1 )是否完全忽略了永久生成,而留给运行旧系列GC的完整GC调用来清除永久代(而这个系列GC也依次收集年轻和成熟的世代,当使用G1而不是CMS时,我不会理解这是可取的)。我主要感兴趣的是,从STW和收集时间上看,在永久代上执行垃圾收集是否比收集终身代更昂贵。
额外的问题: Oracle教程提到永久代是堆的一部分。我一直认为永久生成是在堆之外显式地分配的。最近的HotSpot实现是否发生了这种变化?
谢谢你的帮助!
发布于 2013-12-12 06:21:26
有一个关于使JEP156能够在不使用完整GC的情况下卸载类的G1,但“依赖”部分指出,在使用[http://openjdk.java.net/jeps/122]时等待,直到永久代消失,以使JEP156更易于实现是有意义的。
因此,这个问题似乎确实可以在Java 8中得到解决,但这不仅仅是由于元空间的存在,而是因为元空间被视为实现类的增量GC的先决条件。
这就是我的理解。
编辑:在过去的几天里,我一直在听一些今年的JavaOne会议,很幸运的是,今天我找到了一个关于PermGen去除的,上面写着:
https://stackoverflow.com/questions/20453322
复制相似问题