Java 旧的一代需要多满才能触发一个主要的GC循环?
我正在致力于解决生产环境中垃圾收集利用率高的问题,我想知道设置一个大的堆大小是否可以防止触发一个主要的GC循环,从而保证旧一代永远不会被填满 为了实现这一点,我设想有一个特定的阈值标记,在该阈值标记处会触发一个主要的GC循环。如果这个假设是真的,有人能告诉我这个数字是多少吗?如果没有,我希望您能解释一下这些主要循环实际上是如何触发的,以及我的大堆策略是否有可能工作。Concurrent Mark Sweep 假设您使用并发标记扫描收集器(例如Java 旧的一代需要多满才能触发一个主要的GC循环?,java,garbage-collection,size,heap,Java,Garbage Collection,Size,Heap,我正在致力于解决生产环境中垃圾收集利用率高的问题,我想知道设置一个大的堆大小是否可以防止触发一个主要的GC循环,从而保证旧一代永远不会被填满 为了实现这一点,我设想有一个特定的阈值标记,在该阈值标记处会触发一个主要的GC循环。如果这个假设是真的,有人能告诉我这个数字是多少吗?如果没有,我希望您能解释一下这些主要循环实际上是如何触发的,以及我的大堆策略是否有可能工作。Concurrent Mark Sweep 假设您使用并发标记扫描收集器(例如-XX:+UseConcMarkSweepGC),默认
-XX:+UseConcMarkSweepGC
),默认情况下,当OldGen达到70%时,它开始并发收集。但可通过CMSInitiatingOccupancyFraction
进行调节,例如:
-XX:CMSInitiatingOccupancyFraction=42
这将以42%开始并发收集,而默认值为70%
请注意,CMSInitiatingOccupancyFraction
仅对第一个集合有效。要“永久”启用它,请添加仅使用CMSinitiatingOccupancy
:
-XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=42
最大堆空闲率 您还可以查看
MaxHeapFreeRatio
,它是GC后为避免收缩而释放的堆的最大百分比,默认设置为70%,但您也可以更改它:
-XX:MaxHeapFreeRatio=42
追根究底 但在更改任何参数之前,最好先了解“垃圾收集利用率高”的原因:
- 如果需要经常收集,为什么会送到老人家
- 您正在捕获流数据吗
- 堆大小对于问题来说是否太小
- 在堆外存储这个特定的数据有意义吗
- 等等
other具体是哪种版本的Java?@bobdabelina你真的应该接受答案。。如果你使用CMSThanks Tolitius。我们确实在使用CMS,答案非常有用。