最大堆大小被忽略超过12GB

时间:2017-04-03 19:41:43

标签: java tomcat garbage-collection

环境:

  • AWS R4.XLarge(4vCPU,30GB RAM)
  • Windows 2012R2
  • Tomcat 7,jdk-8u102

首先,我不是开发人员,请耐心等待。最大堆设置为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"

我是在正确的轨道上吗?

谢谢,

佛瑞德

1 个答案:

答案 0 :(得分:0)

如前所述,并行GC将抛出“OutOfMemoryError”,如果超过98%的总时间花在垃圾收集上,并且不到2%的堆被恢复

现在,我们已经发现问题在于GC运行太多了。 这个问题可以归结为多个存储桶:

  1. 您是否比GC可以快速创建更多对象?
  2. 您是否在使用corrct GC算法?
  3. 为GC定义的系统参数
  4. 所以,请使用GC的参数更新您的问题。

    我建议您首先使用“-XX:-PrintGCDetails”打印GC详细信息,并使用以下内容创建堆转储文件:-XX:HeapDumpPath =。/ java_pid.hprof

    这有助于我们评估上述第1点和第2点。 更改GC算法需要进行许多权衡,并且必须根据具体情况确定正确的算法