1. 通过top查看占用cpu或者内存高的进程对应PID
top 或者 ps aux (两个命令都可以)
2. 找到对应的PID后,查看对应线程i
通过命令top -Hp PID 例如top -Hp 19485就可以列出该进程下的所有线程id
3.通过输出大写的P查看线程占用cpu最高的或者通过大写M查看内存占用最高的,然后找到19530这个线程id
输出:19530
4. 使用命令printf “%x\n” 19530输出线程id对应的十六进制码,1ab4f这个码是为了过滤线程id查到对应的代码
printf “%x\n” 19530
输出:1ab4f
5.使用命令jstack 19485|grep 1ab4f 备注PID是进程的id,1ab4f是这个进程下的一个占用最高cpu的线程id对应的十六进制码】
jstack 19485|grep 1ab4f
输出: 通过上面的输出找出对应的消耗CPU的代码
jstack 19485|grep 1ab4f -A 30
输出30行相关代码
linux 其他命令使用 jmap jstat
1.. jmap 命令
使用jmap -histo[:live] pid查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象,如下:

class name是对象类型,说明如下:
-
B byte -
C char -
D double -
F float -
I int -
J long -
Z boolean -
[ 数组,如[I表示int[] -
[L+类名 其他对象
jmap 查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况

还有一个很常用的情况是:用jmap把进程内存使用情况dump到文件中,再用jhat分析查看。jmap进行dump命令格式如下:
jmap -dump:format=b,file=dumpFileName
jmap -dump:format=b,file=/app/logs/dump.dat 74
jhat -port 9998 /app/logs/dump.dat
然后就可以在浏览器中输入主机地址:9998查看了:

2. jstat 命令
jstat对于查看Jvm的堆栈信息很有用。能够查看eden,survivor,old,perm等heap的capacity,utility信息,对于查看系统是不是有内存泄漏以及参数设置是否合理有不错的意义。

总结:
对于jstack日志,我们要着重关注如下关键信息
Deadlock:表示有死锁
Waiting on condition:等待某个资源或条件发生来唤醒自己。具体需要结合jstacktrace来分析,比如线程正在sleep,网络读写繁忙而等待
Blocked:阻塞
Waiting on monitor entry:在等待获取锁
如果说系统慢,那么要特别关注Blocked,Waiting on condition
如果说系统的cpu耗的高,要特别关注线程执行是否有死循环,那么此时要关注下Runable状态。

本文介绍了如何使用Linux命令行工具jstack、jmap和jstat来诊断Java应用的性能问题。通过jstack查找CPU或内存占用高的线程,jmap分析堆内存使用情况,jstat监测JVM堆栈信息,帮助定位系统慢或CPU高的原因,如死锁、等待资源、阻塞等状态的线程。此外,还提到了jhat用于进一步分析内存dump文件。
1177

被折叠的 条评论
为什么被折叠?



