我们正在运行一个有时会“冻结”的 Java 应用程序,因为某些线程正在使用几乎所有堆。
尽管 JVM 执行的 Full GC 持续了 60 秒以上,但应用程序从未因 OutOfMemoryError 错误而终止。
我从 Java 文档中读到:
如果花费太多时间进行垃圾收集,吞吐量收集器将抛出内存不足异常。
例如,如果 JVM 花费超过 98% 的总时间进行垃圾回收,并且只回收不到 2% 的堆,则会抛出内存不足的预期。
我想更多地了解这 98% 的时间意味着什么(时间范围是多少?),以及是否可以降低这个值,即,如果应用程序将 90% 的时间花在 GC 上且无法释放,则抛出 OOME超过堆的 10%。
目标是确保应用程序将在 OOME 中终止(而不是仅执行 GC),以便我们可以在 OOME 上生成转储。
以下是我们使用的内存和 GC 设置(操作系统是 Solaris):
-Xms2048m -Xmx2048m \
-Xmn512m \
-XX:PermSize=256m
-XX:MaxPermSize=256m \
-XX:+UseParNewGC
-XX:ParallelGCThreads=16 \
-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled \
-XX:+DisableExplicitGC \
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps \
-XX:+PrintClassHistogram \
-Xloggc:/gcmonitor.log \
-XX:+HandlePromotionFailure \
-XX:SurvivorRatio=4
-XX:TargetSurvivorRatio=90
-XX:MaxTenuringThreshold=10 \
-XX:+UseTLAB
-XX:TLABSize=32k
-XX:+ResizeTLAB \
-XX:+UseMPSS \
我想了解更多关于这 98% 时间意味着什么的信息(时间范围是多少?)
回答这个问题:超出 GC 开销限制 https://stackoverflow.com/questions/4371505建议为 1 分钟。
可以降低这个值
再次研究上面提到的问题,看起来你可以使用GCTimeLimit
and GCHeapFreeLimit
参数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)