1.ps
ps aux|grep java 获取java进程id
2.jstat
一条命令就够了
jstat -gcutil pid 1000 1000 两个数值分别为时间间隔和监听次数
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
8.76 0.00 50.32 15.49 97.77 95.24 104 4.459 6 2.122 6.580
8.76 0.00 50.44 15.49 97.77 95.24 104 4.459 6 2.122 6.580
8.76 0.00 50.44 15.49 97.77 95.24 104 4.459 6 2.122 6.580
8.76 0.00 50.44 15.49 97.77 95.24 104 4.459 6 2.122 6.580
S0 S1 E O 不解释,M为方法区,1.7及以下版本这里是P,YGC FGC为java进程启动后gc总次数,YGCT FGCT为gc总耗时
3.jstack
jstack pid打印线程栈,其中nid为16进制线程id
4.jmap
查看内存中对象数量 jmap -histo pid
查看占用最多的6个对象
jmap -histo pid|sort -nrk2|head -6 注意:这里histo:live,加上live会强制Full Gc
查看数量大于1000的对象
jmap -histo pid|'{if ($2>1000) print} '
dump堆 jmap -dump:live,format=b,file=/tmp/heap2.bin pid 注意:加上live会强制Full Gc
5.top
top -Hp pid可以查看java进程内线程情况
6.EcliseMat
分析堆的工具
7.jprofile
需要在服务器安装agent重启java进程,本地attach查看
8.btrace
这个工具有点diao,阿里这边很多问题排查,都用这个
9.perf
linux自带perf,不能分析java的栈