我以前使用2G的新年龄记忆,我看到小gc每10秒发生一次,每次花费0.1-0.15秒,我想减少小gc频率,所以我将新年龄记忆设置为3G。在这之后,每15秒发生一次小gc,但它需要大约0.3秒才能完成。为什么当我增加新年龄的记忆力时,小GC时间会增加?我注意到在我增加内存后,GC后的活动对象从55M增加到80M,原因是什么?
发布于 2016-11-02 14:58:01
原因是,在更大的内存区域中有更多的活动对象。GC时间主要根据必须复制到幸存区域的活动对象的数量(和总大小)进行调整。
只有当您创建了许多同时存在于YG中且不完全适合YG的对象时,您才能从更大的年轻一代区域中获益。这迫使他们被延续到老一代。
否则,总GC时间保持不变,您只需选择如何将其拆分为各个终止事件:更长和更少的事件或更短和更频繁的事件。
发布于 2016-11-02 15:42:44
如果您希望增加年轻集合之间的时间间隔,则需要增加伊甸园大小。当你改变年轻一代的大小时,你可能还会改变两件事,幸存者空间的大小和持续时间阈值。保留时间决定了对象在升级到保留空间之前在幸存空间之间来回复制的次数。默认的租期阈值是4,但某些参数(如-Xmn
)会将租期阈值更改为15,除非您也指定了它。
您可以通过设置-XX:SurvivorRatio=8
表单示例来增加伊甸园空间,并将延长时间限制为-XX:MaxTenuringThreshold=4
限制延长时间阈值的缺点是更多的对象将被提升为延长时间空间,这会给整个GC带来压力。
在尝试保留你的GC之前,我总是建议你做一个内存配置文件,看看分配情况,比如使用飞行记录器。我经常发现你可以将垃圾率降低2-4倍,这将使调优你的应用程序变得更加容易。
https://stackoverflow.com/questions/40373999
复制相似问题