Arthas如何用于性能问题定位

一、背景

Arthas是阿里开源的一款Java应用监控诊断工具。能做的事很多:查看JVM中类加载信息、方法执行耗时、入参和出参、反编译字节码甚至能动态修改字节码改变代码执行逻辑。

本文简单介绍Java应用性能调优过程中如何使用Arthas查看方法内部的执行耗时分布。

二、最简使用方法

  1. 需要调优的Java应用所在服务器安装Arthas。注意需要使用Java应用相同的用户ID。安装地址Arthas下载地址
  2. 解压后启动java -jar arthas-boot.jar
  3. 选择Java进程。题外话,Arthas是通过Java Agent技术注入字节码来实现的。
  4. 使用Arthas的trace命令来监控Java方法耗时分布。
1
java -jar arthas-boot.jar

trace```

一次注入一个方法。n限制统计方法调用的次数,超过次数则退出trace com.xxx.service.impl.Service1 parseParams  -n 5 –skipJDKMethod false # 同时匹配多个类,多个方法。避免多次注入trace -E com.xxx.service.field.impl.DataSetFieldService|com.xxx.service.impl.DataSetService realFields|process4ExtractDsAndDynamicFields|analysisConfigInfo -n 5  –skipJDKMethod false ‘1==1’

1

一次注入一个方法。n限制统计方法调用的次数,超过次数则退出trace com.xxx.service.impl.Service1 parseParams  -n 5 –skipJDKMethod false # 同时匹配多个类,多个方法。避免多次注入trace -E com.xxx.service.field.impl.DataSetFieldService|com.xxx.service.impl.DataSetService realFields|process4ExtractDsAndDynamicFields|analysisConfigInfo -n 5  –skipJDKMethod false ‘1==1’


1. 通过网站页面或者curl、Postman等触发方法调用,就可以看到方法内部调用的耗时分布了。一般超过n定义的次数后也会直接退出。

**n**![image](/images/wechat/img_4d90144b5848.png)

# 三、后记

局限性:

**局限性**- 不能通过jps感知的Java进程不能注入和监控。这要求Java进程的用户ID和Arthas进程的用户ID必须一致
- 方法调用过程中AOP逻辑不能展示,但是耗时会在外围方法调用中体现。比如Mybatis Interceptor中存在耗时的逻辑不会体现在方法调用栈中,但是Mybatis方法调用整体耗时长会体现。这会增加性能问题定位的难度

**jps**