java 程序占满 CPU

596人浏览 / 0人评论

参考

一种CPU占用过高的故障定位分析方法_莫叫石榴姐的博客-CSDN博客

https://blog.csdn.net/qq_33129875/article/details/129283010

https://blog.csdn.net/kx3005320013/article/details/127121812

使用 Arthas

官网:https://arthas.aliyun.com/doc/

其他

方式一

操作:

# 查看进程 pid
top

# ps -ef 或者jps进一步定位得知其具体的后台应用程序名字
ps -ef | grep pid | grep -v grep
jps -l

# 定位具体的线程ID( -m:显示所有的线程;-p:pid进程使用CPU的时间;-o:该参数后是用户自定义格式)
ps -mp pid -o THREAD,tid,time

# 定位具体的应用程序代码位置
# 将需要的线程ID转换成16进制格式
printf "%x\n" pid
jstack pid | grep 十六进制的pid -A60

# 然后定位到 nid=0x十六进制的pid 位置

方式二

操作:

# 查看进程 pid
top

# 进程中的 CPU 占用情况
top -Hp 2619002

# 将需要的线程ID转换成16进制格式
printf "%x\n" pid

# 使用 jstack 获取线程快照并输出到某个文件中
jstack -l 16进制pid> 16进制pid.txt

# 强制输出
jstack -F -l 16进制pid> 16进制pid.txt

参数:

选项 作用
-F 当正常输出的请求不被响应时,强制输出线程堆栈
-m 如果调用到本地方法的话,可以显示C/C++的堆栈
-l 除堆栈外,显示关于锁的附加信息,在发生死锁时可以用jstack -l pid来观察锁持有情况

全部评论