环境:
首先,我不是一个开发人员,所以请耐心。当最大堆设置为24 GC或16 GC时,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"我在正确的轨道上吗?
谢谢,
弗雷德
发布于 2017-04-11 17:48:04
如前所述,如果超过98%的时间用于垃圾收集,而堆的恢复时间不足2%,则并行GC将抛出"OutOfMemoryError“。
现在,我们已经发现问题在于GC运行得太多了。这个问题可以归结为多个桶:
因此,请用GC参数更新您的问题。
我建议您首先使用"-XX:-PrintGCDetails“打印GC详细信息,并使用:-XX:HeapDumpPath=./java_pid.hprof拥有一个堆转储文件。
这将有助于我们评价上文第1和第2点。更改GC算法需要进行大量的权衡,而正确的Algo必须根据具体情况来确定。
https://stackoverflow.com/questions/43192975
复制相似问题