为什么当我增加新时代内存时,GC时间会增加



我以前使用2G的新时代内存,我看到小gc每10秒发生一次,每次花费0.1-0.15秒,我想减少小gc频率,所以我将新时代内存设置为3G。在此之后,每15秒就会发生一次小的gc,但是大约需要0.3秒才能完成。为什么当我增加新时代内存时,GC时间会增加?我注意到在我增加内存后,GC后的活动对象从55M增加到80M,这是什么原因?

原因是在更大的内存区域中有更多的活动对象。GC时间主要与必须复制到存活区域的活动对象的数量(和总体大小)有关。

只有当你创建许多同时存在且不完全符合YG的对象时,你才能从更大的年轻代区域中获利。这迫使他们成为"老一代"。

否则,总GC时间保持不变,您只需选择如何将其分割为单独的停止世界事件:更长,更少频繁或更短,更频繁。

如果您想增加年轻收集之间的时间,则需要增加Eden的大小。当你改变年轻一代的大小时,你可能也会改变两件事,幸存者空间的大小和终身门槛。保留期阈值决定了对象在提升到保留期空间之前在幸存者空间之间来回复制的次数。默认的保留期阈值是4,但某些参数(如-Xmn)将保留期阈值更改为15,除非您也指定它。

您可以通过设置-XX:SurvivorRatio=8形式的例子来增加Eden空间,并将终身阈值限制为-XX:MaxTenuringThreshold=4。限制终身阈值的缺点是更多的对象将被提升到终身空间,这对您的Full GC施加了压力。

在尝试占用GC之前,我总是建议你做一个内存配置文件来查看分配,例如使用Flight Recorder。通常,我发现您可以将垃圾率降低2-4倍,这将使您的应用程序更容易调优。

最新更新