详细日志显示每7秒发生一次GC
], 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大小是30688332KB和java版本1.7.0_91,Linux-
-服务器-Xmx2048m-Xms2048m-XX: NewRatio=3-XX:MaxPermSize=512m-XX:UseParallelGC-Djava.awt.Headless=true
我尝试将NewRatio更改为2或3,将Xmx更改为
详细的gc日志显示老一代正在努力重新分配内存。下一步应该是什么?请建议!
明智地使用可用资源。
您使用的最大内存为2048MB,我认为这对于今天的应用程序来说相当少。如果您的应用程序需要更多内存,并且如果您有更多可用内存(我认为您有~30GB),那么IMHO,那么您应该分配它。
尝试这些优化作为最后的手段。我认为您应该尝试将xmx大小翻倍,然后比较结果。考虑到系统上没有其他应用程序,将一半可用系统内存分配给您的应用程序没有坏处。
如果增加内存不起作用(因为内存泄漏),那么使用分析器/堆转储和内存分析器或静态代码分析器分析您的应用程序。
你的代码在任何地方调用System. gc()吗?如果是,它被调用的频率是多少?我有一个代码在完成一个大任务时调用gc,但是后来的变化意味着它被调用的频率比预期的要高,导致花费大量时间做无用的GC。
简单的修复方法是删除对System. gc()的调用,让JVM处理它。一个巧妙的修复方法是调用一个帮助方法,该方法检查上次调用GC的时间,并且只有在足够的时间过去时才调用。这可能不需要,所以先尝试简单的修复。