我正在努力解决生产环境中的高垃圾收集利用率问题,并且想知道如果设置一个大的堆大小来保证老一代永远不会被填满会阻止触发一个主要的GC循环。
为了实现这一点,我认为有一个特定的阈值标记可以触发主要的GC循环。 如果这个假设属实,有人可以告诉我这个号码是什么吗? 如果没有,我将理解如何实际触发这些主要周期以及我的大堆策略是否具有工作潜力的解释。
我正在努力解决生产环境中的高垃圾收集利用率问题,并且想知道如果设置一个大的堆大小来保证老一代永远不会被填满会阻止触发一个主要的GC循环。
为了实现这一点,我认为有一个特定的阈值标记可以触发主要的GC循环。 如果这个假设属实,有人可以告诉我这个号码是什么吗? 如果没有,我将理解如何实际触发这些主要周期以及我的大堆策略是否具有工作潜力的解释。
假设您使用Concurrent Mark Sweep收集器(例如-XX:+ UseConcMarkSweepGC),默认情况下,当OldGen达到70%时,它会同时开始收集。 但它可以通过CMSInitiatingOccupancyFraction进行调整,例如:
-XX:CMSInitiatingOccupancyFraction=42
这将开始并发收集率为42%,而默认值为70%
请注意,CMSInitiatingOccupancyFraction仅对第一个集合有效。 要启用它“for good”,请添加UseCMSInitiatingOccupancyOnly:
-XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=42
您还可以查看MaxHeapFreeRatio,它是GC 之后可用堆的最大百分比,以避免收缩,默认情况下设置为70% ,但您也可以更改它:
-XX:MaxHeapFreeRatio=42
但在更改任何参数之前,最好了解这种“高垃圾收集利用率”的原因:
因为通常JVM非常善于知道何时收集,并且它只会变得更好。