问题:
在运行Java服务时,时常与遇到CPU过大,程序卡死的情况;以下方式可以通过JVM排查定位发生错误的代码:
Linux环境:
1、top
命令,查询占用cpu过大的服务ID(pid)
2、ps -mp {pid} -o THREAD,tid,time | sort -rn
查询服务中各线程占用情况,获取线程 tid
3、printf “%x\n” tid
将线程ID 转成 16进制
4、jstack {pid} |grep {tid} -A 30
使用jstack 命令打印线程堆栈信息
5、 jstat -gcutil {pid} 2000 10
查看进程的内存情况
6、jstat {pid} >>jstat.out
导出文件,查看详细报错位置
windows环境:
1、在进程服务中,找到javaw.exe服务, 获取 服务ID(pid)
2、使用 jstack -l {pid} > c:/***.stack
命令导出运行快照
3、在windows下查看线程的CPU占用率,需要使用工具Process Explorer v15.3 下载地址
4、在相应的进程中右键properties中找到Threads,找到占用CPU最高的线程ID {tid}
5、将tid转成16进制
6、在导出来的.stack快照文件中搜索十六进制的{tid}相应位置查询详细错误信息即可