>>问题现象
环境:NeoShine Linux+Jdk 1.5.0_17+Apusic 403
JVM crash掉,产生hs_err_pid<pid>.log文件。
>>日志情况
主要日志信息如下:
JVM crash main information:
1.JVM:(1.5.0_17-b04 mixed mode)
A fatal error has been detected by the Java Runtime Environment:
2.SIGSEGV (0xb)
3.libjvm.so+0x48acf3
4.Java Threads: ( => current thread )
ComiplerThread [_thread_in_native]
5.Current CompileTask:
com.apusic.net.Muxer.acceptConnection(SocketAdaptor paramSocketAdaptor)
6.Heap的使用情况正常。
>>问题分析
通过最近两次的JVM crash的日志来看,此两次的日志信息是一样的,都是因为JavaThread的CompilerThread[_thread_in_native]堵塞引起,而Heap的使用情况正常。
经查看JVM的配置参数发现,多了一个JPDA的参数,如下:
"-Xdebug -Xrunjdwp:server=y,suspend=n,transport=dt_socket,address=6888"
在Apusic的Normal启动方式中多添加了:JPDA参数,而且开发商是以normal方式启动的,此参数应该在debug模式下使用,而不要在normal和product模式下使用。
此问题也有可能是JDK的一个bug。
>>解决方案
通过参阅sun网站上的问题报告及相关资料,提出如下解决方法:
1、 删掉JVM中的JPDA参数,即删掉:
"-Xdebug -Xrunjdwp:server=y,suspend=n,transport=dt_socket,address=6888"
2、 在JVM的启动参数中加上:
-XX:-EliminateLocks
解决jdk1.5.0_17的一个bug。
并且将GC的策略由原来的CMS调整为如下:(以下为主要参数)
-server -Xms1024m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=128m -XX:MaxNewSize=384M -XX:NewSize=384M -XX:SurvivorRatio=8 -Xss512K -XX:+UseParallelGC -XX:ParallelGCThreads=8 -XX:+ParallelRefProcEnabled -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError
3、 对OS和Apusic进行再优化:
3.1、Apusic范围的OS方面配置如下:
ulimit -n 65535
ulimit -s 20480
3.2、Apusic线程池调优及KeepAlive参数调整:
HttpHandler
MuxHandler
KeepAlive
-Dcom.apusic.net.bio=true
建议:以nohup和生产模式启动Apusic。
参见:sun 官网:http://www.oracle.com/technetwork/java/javase/crashes-137240.html#gbyzu
4.1.4 Crash in the HotSpot Compiler Thread
Tips:排除某些类方法的编译,可以配置如下JVM参数:
-XX:CompileCommand=exclude,com/apusic/net/Muxer.acceptConnection
注意:类是包全路径,标识符之间用【/】隔开,而类名和方法点用英文句号【.】隔开,动作exclude和类之间用【,】隔开。
环境:NeoShine Linux+Jdk 1.5.0_17+Apusic 403
JVM crash掉,产生hs_err_pid<pid>.log文件。
>>日志情况
主要日志信息如下:
JVM crash main information:
1.JVM:(1.5.0_17-b04 mixed mode)
A fatal error has been detected by the Java Runtime Environment:
2.SIGSEGV (0xb)
3.libjvm.so+0x48acf3
4.Java Threads: ( => current thread )
ComiplerThread [_thread_in_native]
5.Current CompileTask:
com.apusic.net.Muxer.acceptConnection(SocketAdaptor paramSocketAdaptor)
6.Heap的使用情况正常。
>>问题分析
通过最近两次的JVM crash的日志来看,此两次的日志信息是一样的,都是因为JavaThread的CompilerThread[_thread_in_native]堵塞引起,而Heap的使用情况正常。
经查看JVM的配置参数发现,多了一个JPDA的参数,如下:
"-Xdebug -Xrunjdwp:server=y,suspend=n,transport=dt_socket,address=6888"
在Apusic的Normal启动方式中多添加了:JPDA参数,而且开发商是以normal方式启动的,此参数应该在debug模式下使用,而不要在normal和product模式下使用。
此问题也有可能是JDK的一个bug。
>>解决方案
通过参阅sun网站上的问题报告及相关资料,提出如下解决方法:
1、 删掉JVM中的JPDA参数,即删掉:
"-Xdebug -Xrunjdwp:server=y,suspend=n,transport=dt_socket,address=6888"
2、 在JVM的启动参数中加上:
-XX:-EliminateLocks
解决jdk1.5.0_17的一个bug。
并且将GC的策略由原来的CMS调整为如下:(以下为主要参数)
-server -Xms1024m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=128m -XX:MaxNewSize=384M -XX:NewSize=384M -XX:SurvivorRatio=8 -Xss512K -XX:+UseParallelGC -XX:ParallelGCThreads=8 -XX:+ParallelRefProcEnabled -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError
3、 对OS和Apusic进行再优化:
3.1、Apusic范围的OS方面配置如下:
ulimit -n 65535
ulimit -s 20480
3.2、Apusic线程池调优及KeepAlive参数调整:
HttpHandler
MuxHandler
KeepAlive
-Dcom.apusic.net.bio=true
建议:以nohup和生产模式启动Apusic。
参见:sun 官网:http://www.oracle.com/technetwork/java/javase/crashes-137240.html#gbyzu
4.1.4 Crash in the HotSpot Compiler Thread
Tips:排除某些类方法的编译,可以配置如下JVM参数:
-XX:CompileCommand=exclude,com/apusic/net/Muxer.acceptConnection
注意:类是包全路径,标识符之间用【/】隔开,而类名和方法点用英文句号【.】隔开,动作exclude和类之间用【,】隔开。