Arthas
Laeni
2024-03-20
快速安装
curl -O https://arthas.aliyun.com/arthas-boot.jar
启动
java -jar arthas-boot.jar [PID]
常用操作
线程
-
打印线程 ID 为 1 的栈
thread 1 -
查找 JVM 里已加载的类
格式:
sc [-d] <类名>(类名支持通配符),如:sc -d *MathGame如果搜索的是接口,还会搜索所有的实现类。
通过
-d参数,可以打印出类加载的具体信息。 -
查找类的具体函数
格式:
sm [-d] <类名> [函数名],如:sc -d *MathGame通过
-d参数,可以打印函数的具体属性。查找特定的函数,比如查找构造函数:
sm java.math.RoundingMode <init> -
查询某类的 classLoaderHash
sc -d *MathGame | grep classLoaderHash -
查看函数的参数/返回值/异常信息
watch demo.MathGame primeFactors returnObj -
获取 class 实例
vmtool --action getInstances --className demo.MathGame --limit 10此示例是获取
demo.MathGame的实例,最多显示10条记录。 -
调用实例方法
vmtool --action getInstances --className demo.MathGame --express 'instances[0].primeFactors(3)' -x 3调用
demo.MathGame实例的primeFactors方法。 -
打印所有的 System Prop 信息
sysprop也可以指定单个 key:
sysprop java.version也可以通过
grep来过滤:sysprop | grep user可以设置新的 value:
sysprop testKey testValue -
获取到环境变量
sysenv其他操作和
sysprop命令类似 -
打印出**
JVM** 的各种详细信息jvm -
反编译代码
格式1:
jad <类名>,如:jad demo.MathGame通过
--source-only参数可以只打印出在反编译的源代码:jad --source-only com.example.demo.arthas.user.UserController -
编译原代码为字节码 - (Memory Compiler)
mc --classLoaderHash 1efbd816 /tmp/UserController.java -d /tmp mc -c 1efbd816 /tmp/UserController.java -d /tmp当只有一个 ClassLoader 实例时可以直接指定 ClassLoader 的类名:
mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/UserController.java -d /tmp -
重新加载字节码
redefine -c 1efbd816 /tmp/com/example/demo/arthas/user/UserController.class只有 JVM 已经存在该字节码时才能使用
redefine重新加载,如果需要增加新的类,可以将类对应的字节码直接放在类路径即可。 -
跟踪调用
跟踪所有
javax.servlet.Filter的调用。trace javax.servlet.Filter *