JVM Crash by libjvm.so+0x48acf3

>>问题现象

环境: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和类之间用【,】隔开。

猜你喜欢

转载自can-do.iteye.com/blog/2253126