环境:
首先,我不是开发人员,请耐心等待。最大堆设置为24GB或16GB Tomcat仅使用4GB,而某些应用程序抛出java.lang.OutOfMemoryError:超出GC开销限制。我的预感是GC是"阻止" Java访问更多内存。开发人员为GC启用的默认设置是:
call :set_XX_java_opts "+UseConcMarkSweepGC"
我已经研究了一下,觉得添加这些参数可以解决这个问题:
call :set_XX_java_opts "+CMSParallelRemarkEnabled"
call :set_XX_java_opts "+ScavengeBeforeFullGC"
call :set_XX_java_opts "+CMSScavengeBeforeRemark"
我是在正确的轨道上吗?
谢谢,
佛瑞德
答案 0 :(得分:0)
如前所述,并行GC将抛出“OutOfMemoryError”,如果超过98%的总时间花在垃圾收集上,并且不到2%的堆被恢复
现在,我们已经发现问题在于GC运行太多了。 这个问题可以归结为多个存储桶:
所以,请使用GC的参数更新您的问题。
我建议您首先使用“-XX:-PrintGCDetails”打印GC详细信息,并使用以下内容创建堆转储文件:-XX:HeapDumpPath =。/ java_pid.hprof
这有助于我们评估上述第1点和第2点。 更改GC算法需要进行许多权衡,并且必须根据具体情况确定正确的算法