java在linux下占用高cpu的一次错误排查

在前两天突然间接到反馈说服务器很卡解决后来做一个记录.

服务器程序平时是稳定的,也没有发现什么特殊峰值,然后上去看到cpu占用率已经占用超过600%,那么问题来了,程序是已经在线上跑超过1个月的东西的,查看错误日志也并没有错误,检查是不是内存已经爆掉了因为频繁GC造成cpu高占用

以下为检查stack与heap的部分截图

java在linux下占用高cpu的一次错误排查_第1张图片

java在linux下占用高cpu的一次错误排查_第2张图片

虽然说老年代已经77%, 但是看起来还是正常的, 并没有到要爆掉的情况

但是观察了几分钟后CPU一直持续占用不下

网上查了一些API后偶然间看到"top -H -p"可以查看某进程下的所有线程

执行后可以看到, 其中8个活跃线程都接近100%占用率了

java在linux下占用高cpu的一次错误排查_第3张图片
有线程就好说了, 通过API知道左边的PID是隶属进程下解释为10进制的线程ID

然后结合进程的STACK信息内的一些信息如图所示 nid=线程id地址(包含0x开头的必然是16进制)


随便查一个PID上面如13063解释为16进制为0x3307在导出的STACK信息内进行搜索

java在linux下占用高cpu的一次错误排查_第4张图片
结果如上图,接下来就是去撸代码了,然后看到程序是一个特殊触发的逻辑,会进行死循环,导致线程迟迟不释放这样用户量一上来就会导致服务器瘫痪了,但是好在是特殊逻辑,没有同时出现,修改后提交之后再次查看服务器状态一切正常了.

为了方便你也成功解决问题, 文中提到的命令:

1\"jstack pid" 为进程stack命令 

2\"jmap -heap pid" 为进程heap命令

3\"jstack -F pid" 查看stack信息, 该命令会挂起进程

4\"jmap -dump:format=b,file=HeapDump.bin " 进行heap快照, 该命令执行期间也会挂起进程



你可能感兴趣的:(linux,java)