在项目快速迭代中版本发布频繁 近期上线报错一个JVM导致服务器cpu飙高 但内存充足的原因现象. 对于耗内存的JVM程序来而言, 基本可以断定是线程僵死(死锁、死循环等)问题.
这里是纪录一下排查linux服务器下JVM线程的基本流程,做一个排查手册:
1、 查看服务器运行情况, 找到一直占用cpu的进程[pid]: top 或 jps -l
2、 通过进程[pid] 获得JVM进程的线程运行情况: top -Hp [pid]
3、获取到长时间运行的线程[pid] 并转换为16进制: printf '%X ' [pid]
此时得到线程堆栈信息中对应线程的nid(16进制)
4、依据获得16进制的线程[pid] 打印堆栈信息: jstack -l [pid] | grep [nid] -A 200
其中 [pid] 为java进程id [nid]为对应长时间运行的线程id -A参数表示要显示几行信息 否则只显示一行信息。
5、分析线程堆栈信息: JVM故障分析系列之四:jstack生成的Thread Dump日志线程状态
参考连接: