前言
针对一个接口,请求耗时过长,是忍无可忍的,但是如果没有工具的帮助,是否还单纯的使用 System.currentTimeMillis()
去打印时间?倘若我们一个接口里面的调用链路包含100多个实现方法,那怎么排查是哪个方法导致的整体耗时过长?
解决思路关键词
Arthas、trace命令
使用Arthas排查
前提:启动Java项目
- GitHub直接下载Arthas即可,下载官方的包
arthas-bin.zip
- 本地启动Arthas,使用
java -jar
启动arthas-boot.jar
- 找到Java项目所占用的线程PID,输入对应的数字即可
- 倘若输入对应的数字的时候,发现无法执行,则说明没配置成
JAVA_HOME
,可以输入命令java_home -v
查看是否配置成功。如果不行的话,可以指定jdk的bin目录,执行java -jar
,譬如我的jdk下bin目录地址是/Library/Java/JavaVirtualMachines/jdk1.8.0_333.jdk/Contents/Home/bin
,则执行命令如图:
/Library/Java/JavaVirtualMachines/jdk1.8.0_333.jdk/Contents/Home/bin/java -jar arthas-boot.jar
- 输入指定的PID所对应的编号数字后,即可看到Arthas监控Java程序成功
- 使用trace命令,指定我们想要查看的方法,举例:
格式:trace [全限定类名] [类中的方法名]
例如:trace com.core.service.TeacherService search
- 监听成功后,请求接口,即可观察指定方法中调用的所有链路方法的耗时,可见此处耗时最大的方法,总耗时率占67.19%,即可对其进行排查