ParNewGC花了很长时间

时间:2016-03-11 08:06:40

标签: java performance garbage-collection

enter image description here

我们看到年轻一代GC的停顿时间不合理。我们使用8G的堆大小和4GB的年轻代。有没有人指出我们如何才能找到如此高暂停时间背后的原因?

我们使用-XX:ParallelGCThreads = 48并在48核心机器上运行。我们在centOS 6上使用oracle idk 1.7_0_79

完整的选项列表:

JVM_OPTS="$JVM_OPTS -XX:+UseParNewGC"
JVM_OPTS="$JVM_OPTS -XX:+UseConcMarkSweepGC"
JVM_OPTS="$JVM_OPTS -XX:+CMSParallelRemarkEnabled"
JVM_OPTS="$JVM_OPTS -XX:SurvivorRatio=8"
JVM_OPTS="$JVM_OPTS -XX:MaxTenuringThreshold=15"
JVM_OPTS="$JVM_OPTS -XX:CMSInitiatingOccupancyFraction=85"
JVM_OPTS="$JVM_OPTS -XX:+UseCMSInitiatingOccupancyOnly"
JVM_OPTS="$JVM_OPTS -XX:+UseTLAB"
JVM_OPTS="$JVM_OPTS -XX:MaxPermSize=256m"
JVM_OPTS="$JVM_OPTS -XX:+AggressiveOpts"
JVM_OPTS="$JVM_OPTS -XX:+UseCompressedOops"
JVM_OPTS="$JVM_OPTS -XX:+CMSScavengeBeforeRemark"
JVM_OPTS="$JVM_OPTS -XX:ConcGCThreads=48"
JVM_OPTS="$JVM_OPTS -XX:ParallelGCThreads=48"
JVM_OPTS="$JVM_OPTS -XX:-ExplicitGCInvokesConcurrent"
JVM_OPTS="$JVM_OPTS -XX:+UnlockDiagnosticVMOptions"
JVM_OPTS="$JVM_OPTS -XX:+UseGCTaskAffinity"
JVM_OPTS="$JVM_OPTS -XX:+BindGCTaskThreadsToCPUs"
JVM_OPTS="$JVM_OPTS -XX:ParGCCardsPerStrideChunk=65536"
JVM_OPTS="$JVM_OPTS -XX:CMSScheduleRemarkEdenSizeThreshold=104857600"
JVM_OPTS="$JVM_OPTS -XX:CMSRescanMultiple=32768"
JVM_OPTS="$JVM_OPTS -XX:CMSConcMarkMultiple=32768"
JVM_OPTS="$JVM_OPTS -XX:TargetSurvivorRatio=90"
JVM_OPTS="$JVM_OPTS -XX:+PrintGCDetails"
JVM_OPTS="$JVM_OPTS -XX:+PrintGCDateStamps"
JVM_OPTS="$JVM_OPTS -XX:+PrintGCApplicationStoppedTime"
JVM_OPTS="$JVM_OPTS -XX:+PrintPromotionFailure"

1 个答案:

答案 0 :(得分:0)

为您提供一些建议

  • 我会增加堆大小。 8 GB并不多,而且已满57%。如果满30%,您可能会得到更好的结果。例如试试16 GB。
  • 当您将GC置于较低负载时,GC的效果会更好。一种方法是:a)增加Eden大小,以便更多对象有机会提前死亡,更少的对象可能被提升到终身空间,或b)减少伊甸园大小,具体取决于您的对象分配使用情况。我倾向于增加,但我已经看到减少它有帮助的例子。
  • 降低分配率不仅可以改善暂停时间,还可以提高暂停之间的速度。使用像Flight Recorder这样的内存分析器来查看您的分配并查看可以减少的位置。
  • 考虑在Java 8中使用G1收集器。这可以显着减少/控制暂停时间(前提是机器有空间CPU)。
相关问题