程序本来好好的, 做了一次大修改,测试的时候发现在某些场合下,程序突然消失了,检查后发现JVM崩溃了.
在运行目录下,生成了一个错误log文件: hs_err_pid26290.log
打开看, 能看到一些信息; 同时查了一下网上的一些资料.
JVM的崩溃, 在网上找了一下一般以以下几种情况居多:
1. 内存不够, 尤其是Heap不够造成的, 具体的例子如: http://www.zhuoda.org/hofman/66549.html
2.JVM编译的时候发生的JVM崩溃, 如:
http://seanhe.iteye.com/blog/905997 ,
http://hi.baidu.com/wzgws/item/60ad0dea9ae6aff6e0a5d476
3. GC的时候发生的JVM崩溃, 这个网上最多了.
按照资料的情况,对log文件做了分析,
log文件的内容包括这几部分:(直接抄网上的, 没用自己的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的使用情况正常。
通过Thread, 可以判断问题出在哪个类型的线程中, 通过Heap可以分析内存使用的情况;
分析了自己的log,问题也是出在 CompilerThread0 , 根据Java TroubleShooting Guide的解释(相关部分在http://seanhe.iteye.com/blog/905997中已经给出翻译), 将 相关的方法配制在-XX:CompileCommand中, 问题得以解决;
还有: 崩溃位置的定义在这个log文件中有说明:
Native frames: (
J=compiled Java code,
j=interpreted,
Vv=VM code,
C=native code
)