一:jstack找到最耗cpu的线程并定位代码
1.ps -ef|grep java 或者 jps -l
得到进程pid
2.找到该进程内最耗cpu的线程,我一般使用:
top -Hp pid
3.cpu时间最长的就是pid为21742的线程,printf "x%\n" 21742,得到十六进制,为a
4.使用jstack pid | grep a,打印进程的堆栈信息
二:linux历史指标数据
sar -A:报告所有的信息
sar -u:cpu利用率
sar 2 5:每隔2s显示5次,cpu的使用情况
关于cpu消耗的问题,一般通过这两种方式都可以解决,复杂的话需要借助于perf。
三:jstat和gc日志
jstat -gc pid 1000:每1s钟打印堆间使用情况
jstat -gcutil pid
有些人习惯于查看gc log:
-XX:+PrintGC 输出GC日志
-XX:+PrintGCDetails 输出GC的详细日志
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
-Xloggc:../logs/gc.log 日志文件的输出路径
我一般做如下的设置
-XX:+PrintGCDetails -Xloggc:../logs/gc.log -XX:+PrintGCTimeStamps
四:jmap的使用
jmap -dump:format=b,file=a.bin pid : 当需要dump内存查看的时候,内存dump出来以后,
使用eclipse memory analyzer
jmap -histo:live pid : 在需要强制执行fgc的时候
有些人喜欢使用gcore,不过有些jdk版本支持的并不是很好。
五:btrace工具的使用,没有具体研究,后面贴上来