【发布时间】:2012-02-13 09:28:28
【问题描述】:
我们正在运行一个有时会“冻结”的 Java 应用程序,因为某些线程正在使用几乎所有的堆。 尽管 JVM 执行的 Full GC 持续超过 60 秒,但应用程序永远不会因 OutOfMemoryError 而死。
我从 Java 文档中读到:
如果花费太多时间进行垃圾收集,吞吐量收集器将抛出内存不足异常。 例如,如果 JVM 花费超过 98% 的总时间进行垃圾收集并且回收不到 2% 的堆,它将引发内存不足的预期。
我想了解更多关于这 98% 的时间意味着什么的信息(时间框架是多少?),以及是否可以降低这个值,即如果应用程序在 GC 中花费了 90% 的时间,则抛出 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 \
【问题讨论】:
标签: java garbage-collection out-of-memory