【知识积累】java.lang.OutOfMemoryError: GC overhead limit exceeded

一、日志

2019-06-26 07:09:32.143 ERROR [pool-2-thread-6] [o.s.s.s.TaskUtils$LoggingErrorHandler:95] - Unexpected error occurred in scheduled task.
java.lang.OutOfMemoryError: GC overhead limit exceeded
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.createAutomaticMappings(DefaultResultSetHandler.java:472)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.applyAutomaticMappings(DefaultResultSetHandler.java:512)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getRowValue(DefaultResultSetHandler.java:397)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValuesForSimpleResultMap(DefaultResultSetHandler.java:351)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValues(DefaultResultSetHandler.java:326)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSet(DefaultResultSetHandler.java:299)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:192)
	at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:64)
	at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79)
	at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63)
	at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324)
	at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
	at sun.reflect.GeneratedMethodAccessor96.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
	at com.sun.proxy.$Proxy80.selectList(Unknown Source)
	at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:230)
	at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:137)
	at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:75)
	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
	at com.sun.proxy.$Proxy88.listByStatus(Unknown Source)
	at cn.com.service.impl.MessageServiceImpl.listByStatus(MessageServiceImpl.java:87)
	at cn.com.task.LocalMessageTask.startLocalMessageTask(LocalMessageTask.java:47)
	at cn.com.task.MultiThreadScheduler.startLocalMessageTask(MultiThreadScheduler.java:91)
	at sun.reflect.GeneratedMethodAccessor97.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)

日志不难看出,执行了一个sql操作,导致oom,来查看下具体的代码,第29行:

cn.com.service.impl.MessageServiceImpl.listByStatus(MessageServiceImpl.java:87)

【知识积累】java.lang.OutOfMemoryError: GC overhead limit exceeded_第1张图片

最后实际查询数据量是22W+

二、Tomcat调优

1、windows服务启动(读取注册表的参数

【知识积累】java.lang.OutOfMemoryError: GC overhead limit exceeded_第2张图片

1.1、修改tomcat参数

最后五个参数是新增,其它是原有参数,修改完成,重启Tomcat

-Dcatalina.home=F:\apache-tomcat-8.0.24
-Dcatalina.base=F:\apache-tomcat-8.0.24
-Djava.endorsed.dirs=F:\apache-tomcat-8.0.24\endorsed
-Djava.io.tmpdir=F:\apache-tomcat-8.0.24\temp
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=F:\apache-tomcat-8.0.24\conf\logging.properties
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=F:\apache-tomcat-8.0.24\logs\heapdump.hprof
-Dcom.sun.management.jmxremote.port=8999
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

HeapDumpOnOutOfMemoryError、HeapDumpPath:当发生OOM时,生成dump文件
port、ssl、authenticate:配置jvisual、jconsole,用来分析

Initial memory pool(xms:JVM初试内存):1024
Maxinum memory pool(xmx:JVM最大内存):1024

xms和xmx设置相同,为了能够在java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源

【知识积累】java.lang.OutOfMemoryError: GC overhead limit exceeded_第3张图片

1.2、查看注册表

计算机\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Apache Software Foundation\Procrun 2.0\Tomcat8\Parameters\Java

如果不能使用1.1方式修改,直接修改注册表,在原值下面加上:-Xms1024m -Xmx1024m,修改完成,重启Tomcat。

【知识积累】java.lang.OutOfMemoryError: GC overhead limit exceeded_第4张图片

1.3、查看是否生效

1.3.1、tomcat管理页面

配置:webapps目录下有ROOT、manager、host-manager文件夹,并修改conf目录下的tomcat-users.xml文件。

【知识积累】java.lang.OutOfMemoryError: GC overhead limit exceeded_第5张图片

【知识积累】java.lang.OutOfMemoryError: GC overhead limit exceeded_第6张图片

【知识积累】java.lang.OutOfMemoryError: GC overhead limit exceeded_第7张图片

最后启动tomcat,访问http://localhost:8080/manager,输入帐号密码:admin admin

【知识积累】java.lang.OutOfMemoryError: GC overhead limit exceeded_第8张图片

点击右上角的Server Status:

【知识积累】java.lang.OutOfMemoryError: GC overhead limit exceeded_第9张图片

1.3.2、jvisual(已配置-Dcom.sun.management.jmxremote.port=8999、-Dcom.sun.management.jmxremote.ssl=false、-Dcom.sun.management.jmxremote.authenticate=false)

【知识积累】java.lang.OutOfMemoryError: GC overhead limit exceeded_第10张图片

【知识积累】java.lang.OutOfMemoryError: GC overhead limit exceeded_第11张图片

【知识积累】java.lang.OutOfMemoryError: GC overhead limit exceeded_第12张图片

【知识积累】java.lang.OutOfMemoryError: GC overhead limit exceeded_第13张图片

【知识积累】java.lang.OutOfMemoryError: GC overhead limit exceeded_第14张图片

【知识积累】java.lang.OutOfMemoryError: GC overhead limit exceeded_第15张图片

【知识积累】java.lang.OutOfMemoryError: GC overhead limit exceeded_第16张图片

1.3.3、jconsole(已配置-Dcom.sun.management.jmxremote.port=8999、-Dcom.sun.management.jmxremote.ssl=false、-Dcom.sun.management.jmxremote.authenticate=false)

【知识积累】java.lang.OutOfMemoryError: GC overhead limit exceeded_第17张图片

【知识积累】java.lang.OutOfMemoryError: GC overhead limit exceeded_第18张图片

【知识积累】java.lang.OutOfMemoryError: GC overhead limit exceeded_第19张图片

【知识积累】java.lang.OutOfMemoryError: GC overhead limit exceeded_第20张图片

【知识积累】java.lang.OutOfMemoryError: GC overhead limit exceeded_第21张图片

【知识积累】java.lang.OutOfMemoryError: GC overhead limit exceeded_第22张图片

1.2、startup.bat启动(读取的catalina.bat参数

【知识积累】java.lang.OutOfMemoryError: GC overhead limit exceeded_第23张图片

在catalina.bat最前面加入

set JAVA_OPTS=-Xms1024m -Xmx1024m  -XX:PermSize=256m -XX:MaxPermSize=256m  -XX:+PrintGCDetails 
set JAVA_OPTS=%JAVA_OPTS% -server -verbose:gc 

1.3、Linux

/usr/tomcat7/bin目录下的catalina.sh文件中配置:

export CATALINA_BASE=/usr/appserver/tomcat8
export CATALINA_HOME=/usr/appserver/tomcat8
export CATALINA_TMPDIR=/usr/appserver/tomcat8/temp     
export JAVA_HOME=/usr/appserver/jdk1.8
export JAVA_OPTS='-Xms1024m -Xmx1024m  -XX:PermSize=256m -XX:MaxPermSize=256m  -XX:+PrintGCDetails -server'

springboot启动:

nohup /usr/lib/jvm/jdk1.8.0_162/bin/java -Xms1024m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/sofe/target/tomcat/logs -jar service-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod >nohup.out 2>&1 &

 

你可能感兴趣的:(Java基础)