我正在努力解决生产环境中的高垃圾收集利用率问题,并且想知道如果设置一个大的堆大小来保证老一代永远不会被填满会阻止触发一个主要的GC循环。

为了实现这一点,我认为有一个特定的阈值标记可以触发主要的GC循环。 如果这个假设属实,有人可以告诉我这个号码是什么吗? 如果没有,我将理解如何实际触发这些主要周期以及我的大堆策略是否具有工作潜力的解释。

===============>>#1 票数:4 已采纳

并发马克扫描

假设您使用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

深究

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

  • 如果需要经常收集它,为什么它会进入OldGen?
  • 你在捕捉流数据吗?
  • 堆大小是否太小而无法解决问题?
  • 将这些特定数据存储在堆中是否有意义?
  • 等等..

因为通常JVM非常善于知道何时收集,并且它只会变得更好。


其他H?tSpot VM选项

  ask by bob dabelina translate from so

未解决问题?本站智能推荐:

1回复

100%的老一代-这是一个问题吗?

我们正在对应用程序进行负载测试,一段时间后AppDynamics报告红色的“ PS Old gen”为100% 。 Full GC每10分钟运行一次。 内存的“当前利用率”在70-90%之间变化,这种情况持续了数小时,并且在OOM中从未失败。 我以为,一旦旧发电利用率超过一定水平,GC
1回复

字符串池存在于年轻一代和老一代?

从Java 7中获取的字符串不再存储在permgen区域。 相反,它们存储在正常的堆空间中,这意味着它们必须经历一半的GC和完整的GC。 现在在半个GC之后,那些生存下来的实习生必须从年轻一代转移到老一代。 这是否意味着年轻一代和老一代都有这种字符串民意调查? 接下来让我们
1回复

我可以拥有比老一代更大的年轻人吗?

如果我看到新一代的大多数活动和老一代的空间被利用不足,那么年轻一代的规模是否比老一代更好。 增加新的gen gen以上是否有任何后果? 像-Xmx2g -Xmn1.5g
1回复

“静态最终”直接分配到哪里? 年轻的gen或老一代或perm gen?

是一个“静态决赛”直接分配到年轻一代或老一代或perm gen? (我想它很可能会在我想的时候进入老一代。)如果它是在perm gen中分配的那么,当它在Perm Gen中进行类卸载时会被垃圾收集吗?
3回复

如何在年轻一代的收藏中找出活物?

据我所知,YGC所花费的时间与伊甸园中活物的数量成正比。 我也理解在主要集合中如何计算实时对象(线程堆栈和静态对象中的所有对象以及可传递地从这些对象到达的其他对象。) 但是我不明白年轻一代的收藏中是如何计算出活物的? 如果它解析线程堆栈,那么它需要解析eden + tenured sp
3回复

Java:新一代使用100%,伊甸园空间使用100%,使用空间100%

jmap -heap给出了输出结果: 新一代使用100%,伊甸园空间使用100%,从使用的空间100%,到使用的空间:0%,使用的烫发一代:38% 这是100%的New,Eden,From space - 一个问题吗? 我的JAVA OPTS是: -Xms10240m -Xmx
1回复

记忆缺失:年轻一代的规模仅包括一个幸存者空间

在Java堆上,我希望 年轻一代的大小是eden空间和两个幸存空间 ( 从space 到space )的总和: 但是,GC日志(使用XX:+PrintHeapAtGC )指出, 年轻代的大小是eden空间和幸存空间之一的大小之和: 为什么年轻一代的规模仅包括一个幸存者空间的大小?
1回复

Hadoop:堆空间和gc问题

我目前正在开发一个项目,我需要为我的地图任务提供内存结构。 我做了一些计算,我可以说每个地图任务我不需要超过600MB的内存。 但问题是,经过一段时间我有java堆空间问题或gc开销限制。 我不知道这怎么可能。 这里有一些更多的细节。 我有两个四核系统,12GB内存。 这意味着我
1回复

Java内存/ gc问题(JRE内存,堆空间和完整的gc不足)

我在具有2CPU和3.75GB内存( https://aws.amazon.com/ec2/instance-types/ )的c3.large Amazon EC2 ubuntu计算机上运行Java程序时遇到各种问题。 现在,我正在使用java -Xmx3750m标志运行。 我为几种标
1回复

Java GC的异常行为或内存泄漏?

我正在使用Swing应用程序,最近,我开始看到以下问题: 我必须在单独的窗口中显示非常大的工作报告。 关闭此窗口,然后重新打开相同的作业报告,并收到OutOfMemory Java堆空间错误。 JVM以-Xmx512m启动,当我打开作业报告时创建的所有对象占用大约300MB的堆空间