首页 文章

全GC经常发生

提问于
浏览
0

详细日志显示Full GC发生时间为每7秒 -

], 7.3933980 secs] [Times: user=89.17 sys=1.16, real=7.39 secs]
79959.910: [Full GC [PSYoungGen: 390144K->194442K(451584K)] [ParOldGen: 1572654K->1572852K(1572864K)] 1962798K->1767294K(2024448K) [PSPermGen: 103569K->103569K(103936K)], 7.9599570 secs] [Times: user=95.28 sys=1.09, real=7.96 secs]
79984.776: [Full GC [PSYoungGen: 390144K->196124K(451584K)] [ParOldGen: 1572852K->1572544K(1572864K)] 1962996K->1768668K(2024448K) [PSPermGen: 103569K->103569K(103936K)], 7.6023130 secs] [Times: user=91.82 sys=1.22, real=7.60 secs]
80007.996: [Full GC [PSYoungGen: 390144K->194969K(451584K)] [ParOldGen: 1572544K->1572734K(1572864K)] 1962688K->1767703K(2024448K) [PSPermGen: 103569K->103569K(103936K)], 8.0980790 secs] [Times: user=98.03 sys=1.28, real=8.10 secs]

我正在使用这个JVM参数与Oracle热点64位,RAM大小为30688332 KB和java版本1.7.0_91,在Linux-

-server -Xmx2048m -Xms2048m -XX:NewRatio = 3 -XX:MaxPermSize = 512m -XX:UseParallelGC -Djava.awt.headless = true

jstack结果显示 -
enter image description here

我试图将NewRatio更改为2或3,将Xmx更改为

详细的gc日志显示老一代正在努力重新分配内存 . 下一步应该是什么?请指教!

2 回答

  • 2

    Use available resources wisely.

    您使用的最大内存为2048MB,我认为这对于今天的应用程序来说相当少 . 如果你的应用程序需要更多的内存,如果你有更多的可用内存(我认为你有~30GB)然后恕我直言,那么你应该分配它 .

    尝试这样的优化作为最后的手段 . 我认为你应该尝试加倍你的xmx大小,然后比较结果 . 考虑到系统上没有其他应用程序,将一半可用系统内存分配给您的应用程序没有任何害处 .

    如果增加内存不能解决(因为内存泄漏),那么使用分析器/堆转储和内存分析器或静态代码分析器来分析您的应用程序 .

  • 0

    您的代码是否在任何地方调用System.gc()?如果是这样,它被多久调用一次?我有一个代码,当一个大任务完成时调用gc,但后来的更改意味着它被调用的次数比预期的要频繁,导致花费大量时间做无用的GC .

    简单的解决方法是只删除对System.gc()的调用并让JVM处理它 . 一个聪明的解决方法是调用一个帮助器方法来检查自上次调用GC以来的时间长度,并且仅在有足够时间的情况下调用 . 这可能不需要,所以只需先尝试简单的修复 .

相关问题