在前两天突然间接到反馈说服务器很卡解决后来做一个记录.
服务器程序平时是稳定的,也没有发现什么特殊峰值,然后上去看到cpu占用率已经占用超过600%,那么问题来了,程序是已经在线上跑超过1个月的东西的,查看错误日志也并没有错误,检查是不是内存已经爆掉了因为频繁GC造成cpu高占用
以下为检查stack与heap的部分截图
虽然说老年代已经77%, 但是看起来还是正常的, 并没有到要爆掉的情况
但是观察了几分钟后CPU一直持续占用不下
网上查了一些API后偶然间看到"top -H -p"可以查看某进程下的所有线程
执行后可以看到, 其中8个活跃线程都接近100%占用率了
有线程就好说了, 通过API知道左边的PID是隶属进程下解释为10进制的线程ID
然后结合进程的STACK信息内的一些信息如图所示 nid=线程id地址(包含0x开头的必然是16进制)
随便查一个PID上面如13063解释为16进制为0x3307在导出的STACK信息内进行搜索
结果如上图,接下来就是去撸代码了,然后看到程序是一个特殊触发的逻辑,会进行死循环,导致线程迟迟不释放这样用户量一上来就会导致服务器瘫痪了,但是好在是特殊逻辑,没有同时出现,修改后提交之后再次查看服务器状态一切正常了.
为了方便你也成功解决问题, 文中提到的命令:
1\"jstack pid" 为进程stack命令
2\"jmap -heap pid" 为进程heap命令
3\"jstack -F pid" 查看stack信息, 该命令会挂起进程
4\"jmap -dump:format=b,file=HeapDump.bin <pid>" 进行heap快照, 该命令执行期间也会挂起进程