主要使用
top (-H)
jstack
greys(trace,watch)(安装参考https://github.com/oldmanpushcart/greys-anatomy)
步骤如下:
一.通过top查看当前cpu的情况
top
二.通过查看进程里面的线程情况
top -H
找出占用cpu高的线程,28839
转成16进制:printf %x 28839得出70a7
三.通过jstack查看jvm的线程栈
jstack -l 4949
定位到70a7的线程
四.使用greys深入分析
结合栈和代码找到合适的函数入口,本次找到的函数入口为:com.youzan.sz.trade.sale.event.ExportPayInfoEvent#mergeSheetColumn
./greys.sh 4949 连接上java进程可以看到如下界面:
通过help命令可以看到具体的命令及介绍
通过help + 具体的命令可以查看具体的操作及例子
1.trace com.youzan.sz.trade.sale.event.ExportPayInfoEvent mergeSheetColumn
可以看到基本上此方法都要1.5秒左右,最慢的还要4s,但主要耗时在java.util.Set:forEach(@997)
2.watch com.youzan.sz.trade.sale.event.ExportPayInfoEvent mergeSheetColumn params[3]
深入分析方法到底是怎么回事,还能看方法里面的参数具体是什么
3.trace org.apache.poi.ss.usermodel.Sheet addMergedRegion
由于greys只能看到下一层方法的时间统计,但已经很足够了,我们可以定位到org.apache.poi.xssf.usermodel.XSSFSheet:validateMergedRegions(@355)占用了大部分时间,如果你想再深入分析,当然可以使用org.apache.poi.xssf.usermodel.XSSFSheet:validateMergedRegions深入分析,但本文就不深入了(因为已经基本定位到问题了)
总结:
1.top
2.top -H (printf %x)
3.jstack -l 4949
4../greys.sh 4949
5.trace com.youzan.sz.trade.sale.event.ExportPayInfoEvent mergeSheetColumn(第一层分析)
6.watch com.youzan.sz.trade.sale.event.ExportPayInfoEvent mergeSheetColumn params[3](具体分析)
7.trace org.apache.poi.ss.usermodel.Sheet addMergedRegion(第二层深入分析)
另外greys还有很多其他的命令,可以灵活运用
欢迎拍砖^_^