可以想象Java程序创建新对象的速率有点超过了年轻一代垃圾收集这些对象的速度吗?
...因此,在触发完整的gc之前,会导致堆积的新对象积压更多?
我可以收集哪些指标来识别/验证此方案?
创建的对象的最长寿命约为1秒。大多数人平均活着约400毫秒。
感谢。
答案 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)。
上有一个很好的链接,但有点旧答案 1 :(得分:1)