JVM服务进程挂掉问题定位查询思路

 

昨天有朋友咨询了个RegionServer宕机找不到日志没法定位缘由的问题,干脆就系统整理下JVM服务宕机的可能缘由,方便按照思路去找真正的宕机缘由。c++

1. abort()/halt()/exit()服务器

有些服务会采用lei it crash的思想,在一些超时较久、资源不足的场景下可能会采起直接abort(像部分C服务也会对一些错误的参数直接abort产生core),尤为在HBase RegionServer和Phoenix 实现的coprocessor里有好几处这样的代码。一般鲁棒性高的服务abort后也会有对应的主从、多活、拉起等措施保证用户端影响最小。运维

在实现的好的代码中,全部退出都应当是有日志的。所以首先看本身的服务日志有没有相关退出信息。这里需注意,Java用通用的log4j可能还比较好;部分C++的logger配置很差的话,为了性能,flush落盘频率较低,偶尔会有服务退出了,日志没刷完的状况。jvm

2. 非人为代码的JVM 虚拟机退出
一般有几种状况:
2.1.  JVM自己问题,最多见的就是各种OOM。这个调vm配置、调GC优化就行了。
2.2. JNI退出。若是调用了一些第三方JNI,有时有可能会出现JNI里的C/C++代码core了致使vm崩溃。此时通常会打出 dump日志(强烈建议jvm启动时加上dump参数指定dump日志位置),dump日志里会有core的缘由,c++的stacktrace,崩溃时的一些内存信息等信息。若是开启了core的机器(ulimit -c 设置),还会见到.core文件的产生,可用于gdb跟踪。
2.3. OS内存不足kill进程。这种是看起来悄无声息地结束的,没有dump日志和core。此时须要看下os级别的日志 /var/log/message,翻到宕机时间点,一般能看到OOM killed的信息。性能

3. 服务器关机/重启
此时和你的服务不必定有什么关系了。需联系运维先查清楚服务器关机的缘由,一般是人为或定时reboot、硬件兼容、内核问题等。优化

相关文章
相关标签/搜索