jvm的问题 java.lang.OutOfMemoryError: requested 1146632 bytes for Chunk::new. Out of swap space
最近服务器上出现了一个问题,跑一段时间,jvm就会挂掉,错误信息如下:
java.lang.OutOfMemoryError: requested 1146632 bytes for Chunk::new. Out of swap space
#
# Internal Error (allocation.cpp:215), pid=26822, tid=174123920
# Error: Chunk::new
#
# JRE version: 6.0_22-b04
# Java VM: Java HotSpot(TM) Server VM (17.1-b03 mixed mode linux-x86 )
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#
这个是jvm挂掉生成的错误日志文件
上网查了几篇文章,对我帮助很大
https://confluence.atlassian.com/pages/viewpage.action?pageId=219023686
http://sind.iteye.com/blog/1132459
仔细查看jvm的错误日志,会看到
Current thread (0x0a19f000): JavaThread "CompilerThread1" daemon [_thread_in_native, id=26833, stack(0x0a58e000,0x0a60f000)]
Current CompileTask:
C2:3897 com.*.dao.BaseDaoImpl.getDaoSupport()Lcom/*/dao/support/DAOSupport; (694 bytes)
jvm崩溃之前的当前线程是:CompilerThread1,用于编译优化的,在编译BaseDaoImpl的getDaoSupport方法的时候,出错了,所以导致崩溃。
这个是jdk的一个bug,在6.0_22或者更低版本会有这个问题
解决方案:
1、更换jdk版本,换到jdk 1.6.0_26或以上版本
2、屏蔽掉错误类的编译,让jdk不做编译优化,在tomcat服务的catalina.bat中加入JVM_OPTS加上
JAVA_OPTS=%JAVA_OPTS% -XX:CompileCommand=exclude,com/*/dao/BaseDaoImpl,getDaoSupport