垃圾收集率与对象分配率

时间:2010-07-09 13:14:40

标签: java garbage-collection

可以想象Java程序创建新对象的速率有点超过了年轻一代垃圾收集这些对象的速度吗?

...因此,在触发完整的gc之前,会导致堆积的新对象积压更多?

我可以收集哪些指标来识别/验证此方案?

创建的对象的最长寿命约为1秒。大多数人平均活着约400毫秒。

感谢。

2 个答案:

答案 0 :(得分:3)

当GC启动并将对象从Young移出(到S0或S1)时,死对象不会被复制,因此被丢弃。物体在S0和S1之间来回移动多次,直到它们死亡或它们变得足够老以便转移到旧空间。

S0和S1是Young(伊甸园)和旧空间之间的存储空间。

GC运行的时间太长,有复制的对象,丢掉所有死的对象。当实际需要恢复内存时执行完整GC,需要从旧空间中删除示例对象。

清理Young空间的最快方法实际上是等到大多数对象都死了,因此你不必复制到S0 | S1以及之后的旧版本。

因此填充内存,然后采用较长GC运行的惩罚实际上更有效,然后让GC以非常短的间隔运行。这就是为什么你看到你的记忆力增长并且一直在增长,直到它几乎满了为止,然后它几乎全部下降到最后。

完整的GC是StopTheWorld,需要重新排列旧空间中堆上的对象,在Young空间中不需要它。如果年轻的空间变得充分,快速的物体可以被提升到旧的空间。这不是一个好例子,这是你想到的情况。

要避免使用Full GC,您可以使用创建速率计算Young Space需要的内存量,以确保在必要时不会提升对象。也可以调整S0和S1空间的大小以及对象在它们最终进入Old Space之前在它们之间反弹的次数(需要删除Full GC)。

Tuning Garbage Collection

上有一个很好的链接,但有点旧

答案 1 :(得分:1)

  

可以想象......

我不认为HotSpot串行,并行或CMS收集器会以这种方式运行。您可以阅读所有相关内容hereherehere(适用于G1收藏家)。

有一种情况是在没有年轻一代GC循环的情况下提升对象。也就是说收集器确定旧空间太满而无法容纳任何更多提升的对象。然后串行或并行收集器将执行年轻和老一代的完整集合。

  

我可以收集哪些指标来识别/验证此方案?

GC日志可能会揭示这一点。我不知道。