一、Arthus工具
请参看如下连接:https://blog.youkuaiyun.com/u013735734/article/details/102930307
官方文档:https://gitee.com/arthas/arthas#dashboard
命令集合
初始化
wget https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
通过以上命令安装authus并启动
dashboard命令
运行dashboard
命令
可以看到青年代用的是复制算法;
而老年代用的是标记整理算法;(中间缺少的一行是老年代gc的次数,看一下下面的,Scavenge是对于青年代的复制算法)
thread命令——查看某线程的状态
通过thread
命令查看当前线程的栈:
sc命令——JVM中已经加载的类
通过sc
命令获取JVM中已经加载的类:
jad命令——反编译
通过jad
命令能反编译代码
watch命令——查看当前函数的参数、返回值、异常
通过watch
命令查看函数的参数/返回值/异常信息:
classLoader命令——查看当前类的类加载器
也可以用classLoader
命令查看当前类加载器‘’
二、问题
定位线程死锁
private Object obj1 = new Object();
private Object obj2 = new Object();
new Thread(() -> {
synchronized (obj1) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {}
synchronized (obj2) {
System.out.println("[dead]执行内容111...");
}
}
}).start();
new Thread(() -> {
synchronized (obj2) {
synchronized (obj1) {
System.out.println("[dead]执行内容222...");
}
}
}).start();
直接采用thread
命令,但是thread -b
查看被阻塞的线程。
CPU利用率高
- 首先thread命令查看线程
- 得到线程号码为12号
- 直接找到了哪个方法
查看线程状态
统计程序耗时
使用 trace
命令可以跟踪统计方法耗时