This page validates as XHTML 1.0, and will look much better in a browser that supports web standards, but it is accessible to any browser or Internet device. It was created using techniques detailed at glish.com/css/.
是谁杀死了我的Java应用
经常有客户询问这样的问题:在服务器上的Java进程或应用服务器进程不知道怎么回事被杀死或退出了,并且发生的概率很低,3天才发生一次,能告诉怎样找到原因吗?如果你在使用Solaris10,那么可以使用下面的方法来查找Java进程退出的原因:

如果是Java进程不知道什么原因退出或被杀死,想要分析具体原因,一般来说分下面几步:
1 拿到Java应用程序的日志文件。
一般来说日志文件中会有很应用相关的错误信息。Java进程异常退出的原因最有可能就是应用程序本身的问题。因此检查Java应用程序的日志文件可能是最快定位到错误的方法。
2 查找JVM的致命错误日志
如果应用程序日志文件中没有发现什么线索。那么还可以查看 JVM的致命错误日志。有些致命的错误,比如JNI或虚拟机本身产生的错误,可能使得Java应用程序来不及写日志就退出了。这时候可以查一个以 "hs_err_pid" 开头的日志名,例如hs_err_pid1125.log,其中1125是进程号。这个文件中也记录了一些宝贵的信息来提供一些线索,特别是Java自身的一些Bug。这个文件一般为于当前的工作目录中。用户可以用find命令自己搜索到。
3 查找操作系统的core dump文件
作为被操作系统所调度的进程,Java进程也会在不同的信号下产生Core Dump文件,例如Sig_ill和Seg_segv。这些非常严重的错误的确会使得Java虚拟机根本来不及产生任何日志就宕了。拿到core dump文件就可以使用很多工具来分析具体原因了,例如jmap, jstack等等都可以友好的进行Java进程的Core文件的分析。一般来说,Core文件也放到进程的当前工作目录,用户可以用find命令搜索 “core”。另外可以用coreadm来预先指定core文件存放的地方以及文件名的格式,例如:coreadm -g /var/core/core.%f.%p.%t
4使用Dtrace查找“是谁杀死了Java进程”
但是,有很多情况,进程被杀死的原因很复杂。有可能被别的进程以外杀掉,或被一些脚本不小心kill掉,或者被管理员(或入侵者kill -9)处理掉。这些情况都不会产生日志文件和core dump文件。这些情况很难跟踪。但如果是Solaris10下,可以使用下面的Dtrace脚本来确定“是谁杀死了Java进程”
#!/usr/sbin/dtrace -qs
proc:::signal-send
/args[1]->pr_pid == $1/
{
printf("%s(pid:%d) is sending signal %d to %s\n", execname, pid, args[2],args[1]->pr_fname);
}
Posted at 12:00上午 四月 09, 2007 by 王昱 in Java | 评论[1]