【问题标题】:java.lang.OutOfMemoryError GCOverhead Limit Exceeded Errorjava.lang.OutOfMemoryError GCOverhead Limit Exceeded 错误
【发布时间】:2017-10-27 14:43:07
【问题描述】:

我有一个 java spring 应用程序在带有 Apache Tomcat 8 的 AWS C4.Large(4 Gb 内存)上运行。在服务器启动期间实例化 30000 条记录的 bean 时出现 java.lang.OutOfMemoryError GCOverhead Limit Exceeded Error。

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [java.lang.String]: Factory method 'loadBeanMaps' threw exception; nested exception is java.lang.OutOfMemoryError: GC overhead limit exceeded

但是我的free -m 输出然后,

total used free shared buffers cached Mem: 3765 1706 2059 0 29 446 -/+ buffers/cache: 1230 2534 Swap: 0 0 0

想知道如何查看设置的限制吗?它是基于服务器容量的百分比。因为当我将服务器更改为 m4.large ( 8 Gb Memory Server ) 时没有收到此错误。如何查看此限制?以及如何处理这个错误?

【问题讨论】:

    标签: java spring tomcat garbage-collection


    【解决方案1】:

    您必须检查进程的 JVM 选项

    使用以下命令获取所有正在运行的 Java 进程的详细信息

    jps -mlvV
    

    jps自带Jdk安装,应该在jdk/bin里面

    这将为您提供如下输出

    10780  -Dosgi.requiredJavaVersion=1.7 -Xms40m -XX:MaxPermSize=256m -Xverify:none -Dorg.eclipse.swt.browser.IEVersion=10001 -Xmx1200m -javaagent:lombok.jar -Dfile.encoding=UTF-8
    

    确定您的 Java 应用程序的进程并查看 Xmx 参数中的值

    【讨论】:

      【解决方案2】:

      好的,首先要查看的是您的应用程序是否有任何内存泄漏。您可以查看类直方图以检查任何内存泄漏。您可以为此使用 jcmd 实用程序。

      如果这是在 linux 之类的操作系统上,您可以检查内存参数,简单地 grepping tomcat 进程。

      ps -ef | grep tomcat
      

      默认情况下,如果您在 GC 上花费了超过 98% 的总时间,并且在 GC 后只有不到 2% 的堆被回收,则 JVM 配置为抛出此错误。

      根据我的个人经验,稍微增加堆大小可以解决问题,前提是它不是内存泄漏。

      【讨论】:

        猜你喜欢
        • 2018-06-03
        • 2020-05-21
        • 2016-09-25
        • 1970-01-01
        • 1970-01-01
        • 2021-08-08
        • 2015-01-03
        • 2015-06-29
        • 1970-01-01
        相关资源
        最近更新 更多