【知识积累】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)

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

二、Tomcat调优

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

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垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源

1.2、查看注册表

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

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

1.3、查看是否生效

1.3.1、tomcat管理页面

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

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

点击右上角的Server Status:

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

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

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

在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 &

猜你喜欢

转载自blog.csdn.net/axin1240101543/article/details/93873484
今日推荐