java - 为什么老一代不好?

标签 java garbage-collection

一个对象在被重新定位到老年代空间之前可以在幸存者空间之间复制 7 次,我理解这是为了让对象在被放入老年代空间之前有机会被垃圾收集。我正在听的讲座说这是为了避免对象从年轻代空间提升到老年代空间。

我的问题是为什么升级到老年代不好?讲座没有对此进行解释。

最佳答案

Why is old generation bad?

The lecture that I am listening to states that this is so to avoid object promotion from young generation space to old generation space.

并不是说提升到老一代是不好的一般。只有当生命周期短的对象被意外提升时,这才是糟糕的。

想要老年代中的长生命周期对象,这样它们就不会干扰次要集合。

分配率大致与对象生命周期成反比(这导致了 weak generational hypothesis) 。这意味着短生命周期的对象以高速率生成。 这反过来意味着:如果生命周期较短的对象被提升到老年代,那么老年代将以很高的速度被填满。

次要 GC 通常比主要 GC 更便宜,尤其是在暂停时间方面,这就是为什么您不希望经常运行后者。

对于 CMS 和 G1,您必须进一步区分。他们尝试以部分并发的方式收集老年代——在 G1 的情况下是小块收集——但如果他们遇到一些失败情况 或无法跟上提升,他们就会退回到完全停止世界的 GC费率

从根本上说,过快地提升太多生命周期短的对象违反了构建 GC 所围绕的弱世代假设。

关于java - 为什么老一代不好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31465624/

相关文章:

ruby - 针对 Ruby 规范强制 GC

c# - 如何使 JIT 将堆栈变量扩展到范围末尾(GC 太快)

java - Log4J:备份文件名带有sysdate

java - XML 使用 java saxparser 从不同的 xml 文件中读取一个特殊元素

Java 继承 - sibling 的重写方法问题

使用 byte[] 的 Java 快速 atoi

java - 为什么 Jackson 反序列化 json 无法按顺序打印对象数组?

android - 关于弱引用的问题

language-agnostic - 垃圾收集

java - 将值设置为 null 如何让我们避免徘徊并启用垃圾收集?