当我增加新的年龄记忆时,为什么轻微的GC时间增加

时间:2016-11-02 06:52:23

标签: java garbage-collection jvm

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

2 个答案:

答案 0 :(得分:4)

原因是,较大的内存区域中有更多的活动对象。 GC时间主要与必须复制到幸存者区域的活动对象的数量(和整体大小)进行缩放。

只有当你创造了许多同时生活并且不完全适合YG的物体时,你才能从更大的年轻一代区域中获益。这迫使他们终身养老。

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

答案 1 :(得分:1)

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

您可以通过设置-XX:SurvivorRatio=8表格示例来增加伊甸园空间,并将期限限制为-XX:MaxTenuringThreshold=4限制期限阈值的缺点是更多的对象将被提升到终身空间,给你的Full GC施加压力。

在尝试使用GC之前,我总是建议您查看分配的内存配置文件,例如:与飞行记录器。通常我发现您可以将垃圾率降低2-4倍,这将使您的应用程序调整更加容易。