Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 旧的一代需要多满才能触发一个主要的GC循环?_Java_Garbage Collection_Size_Heap - Fatal编程技术网

Java 旧的一代需要多满才能触发一个主要的GC循环?

Java 旧的一代需要多满才能触发一个主要的GC循环?,java,garbage-collection,size,heap,Java,Garbage Collection,Size,Heap,我正在致力于解决生产环境中垃圾收集利用率高的问题,我想知道设置一个大的堆大小是否可以防止触发一个主要的GC循环,从而保证旧一代永远不会被填满 为了实现这一点,我设想有一个特定的阈值标记,在该阈值标记处会触发一个主要的GC循环。如果这个假设是真的,有人能告诉我这个数字是多少吗?如果没有,我希望您能解释一下这些主要循环实际上是如何触发的,以及我的大堆策略是否有可能工作。Concurrent Mark Sweep 假设您使用并发标记扫描收集器(例如-XX:+UseConcMarkSweepGC),默认

我正在致力于解决生产环境中垃圾收集利用率高的问题,我想知道设置一个大的堆大小是否可以防止触发一个主要的GC循环,从而保证旧一代永远不会被填满

为了实现这一点,我设想有一个特定的阈值标记,在该阈值标记处会触发一个主要的GC循环。如果这个假设是真的,有人能告诉我这个数字是多少吗?如果没有,我希望您能解释一下这些主要循环实际上是如何触发的,以及我的大堆策略是否有可能工作。

Concurrent Mark Sweep 假设您使用并发标记扫描收集器(例如
-XX:+UseConcMarkSweepGC
),默认情况下,当OldGen达到70%时,它开始并发收集。但可通过
CMSInitiatingOccupancyFraction
进行调节,例如:

-XX:CMSInitiatingOccupancyFraction=42
这将以42%开始并发收集,而默认值为70%

请注意,
CMSInitiatingOccupancyFraction
仅对第一个集合有效。要“永久”启用它,请添加
仅使用CMSinitiatingOccupancy

-XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=42

最大堆空闲率 您还可以查看
MaxHeapFreeRatio
,它是GC后为避免收缩而释放的堆的最大百分比,默认设置为70%,但您也可以更改它:

-XX:MaxHeapFreeRatio=42

追根究底 但在更改任何参数之前,最好先了解“垃圾收集利用率高”的原因:

  • 如果需要经常收集,为什么会送到老人家
  • 您正在捕获流数据吗
  • 堆大小对于问题来说是否太小
  • 在堆外存储这个特定的数据有意义吗
  • 等等
因为JVM通常非常擅长知道何时收集,而且它只会越来越好



other

具体是哪种版本的Java?@bobdabelina你真的应该接受答案。。如果你使用CMSThanks Tolitius。我们确实在使用CMS,答案非常有用。