我有一个使用Apache Tomcat 8在AWS C4.Large(4 Gb内存)上运行的java spring应用程序。在服务器启动期间实例化30000条记录的bean时,会出现java.lang.OutOfMemoryError GCOverhead Limit Exceeded错误。
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内存服务器)时,我没有收到此错误。如何查看此限制?以及如何处理这个错误?
答案 0 :(得分:0)
您必须检查流程的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
参数
答案 1 :(得分:0)
好的,首先要看的是你的应用程序是否有任何内存泄漏。你可以看到类直方图来检查任何内存泄漏。你可以使用jcmd实用程序。
如果这是在Linux上的操作系统,那么你可以检查内存参数,简单地使用tomcat进程。
ps -ef | grep tomcat
默认情况下,如果您在GC中花费的时间超过总时间的98%并且GC少于2%的堆恢复后,JVM配置为抛出此错误。
根据我个人的经验,增加堆大小可以解决问题,只要它不是内存泄漏。