项目运行发现接口执行慢,排查主要在于找出哪些方法执行慢,一般需要打印方法执行时长的日志。通过对执行时长的日志观察对比,最终可找到慢的原因。
方案 | 优势 | 劣势 |
---|---|---|
System.currentTimeMillis()相减 | 简单 | 代码侵入且繁琐 |
StopWatch | 简单且更加方便 | 代码侵入且繁琐 |
SpringAOP | 实现统一按切面计算,较少侵入 | 私有和静态方法无法拦截 |
Java Agent | 实现统一计算所有方法,零侵入 | 技术难度较高 |
从开发一个开发测试和排查问题工具角度出发,使用Java Agent技术实现,能够不修改任何业务代码的前提下(零侵入),对所有的业务代码里的任意方法做时长统计。 代码地址:https://github.com/YorkHwang/exec-timer
-
获取agent包 方式一:直接下载jar:exec-timer.jar
方式二:自己打包: mvn clean package 在target目录下将生成对应的exec-timer.jar
-
测试用例
VM加上如下参数
-javaagent:target/[email protected]$testApp||@C-com.ayg.tools.test.AppTest
执行测试用例 com.ayg.tools.test.AppTest.testApp()
- Jar启动方式
javar -javaaget:[exec-timer.jar全路径]=@M|C|P-包全名|类全名$方法1,方法2...方法N -jar [可执行Jar的全路径]
示例: java -javaagent:/code/open/exec-timer/target/[email protected] -jar contract-web.jar
- 命令说明
a.指定类方法打印执行时长: @M-类全名$方法1,方法2 示例:@M-com.ayg.contract.service.ContractService$addContract,updateContract
b.指定类所有方法打印执行时长: @C-类全名 示例:@C-com.ayg.contract.service.ContractService
c.指定包下所有类所有方法打印执行时长: @P-包名 示例:@M-com.ayg.contract.service
多个命令用双竖线||间隔