Arthas的thread、trace命令

thread命令

thread命令主要查看当前线程信息,查看线程的堆栈。

1.查看所有线程的信息:

1.1 thread
我们可以看到线程的id、名称、状态、占用cpu这些信息。以及一个汇总信息。

Arthas的thread、trace命令_第1张图片
1.2 thread --state 线程状态
在线程很多的情况下,我们可以通过thread --state 线程状态命令进行过滤,只展示某种状态的线程

在这里插入图片描述

2.查看某个id线程堆栈:

thread id
下面这个例子比较简单,查看主线程的堆栈信息。
Arthas的thread、trace命令_第2张图片

3.找出当前阻塞的线程

thread -b
此命令类似于我们使用jdk的jstack pid命令找死锁的线程

以下情况表示程序中没有死锁
在这里插入图片描述
死锁演示

public class Sisuo {

    public static void main(String[] args) {
        Object lock1 = new Object();
        Object lock2 = new Object();

        new Thread(() -> {
            synchronized (lock1){
                System.out.println("1获取到锁");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lock2){
                    System.out.println("线程一获取到2的锁");
                }
            }
        }).start();

        new Thread(() -> {
            System.out.println("2获取到锁");
            synchronized (lock2){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lock1){
                    System.out.println("线程2获取到1的锁");
                }
            }
        }).start();

        System.out.println("main执行完毕!!!!!!!!!!!!!!!!!!");
    }
}

运行上面代码,然后再用Arthas观察此程序,并用thread -b检查是否有死锁
通过thread -b命令我们可以看到,有检查到死锁,并且提示了是那两个线程,哪个类的什么方法。
如果我们线上机器cpu突然飙到很高,并且下不来。我们可以尝试用thread -b命令来检测下。个人感觉比jdk的jstack命令好用很多,缺点是这个就需服务器多运行一个Arthas的agent.
Arthas的thread、trace命令_第3张图片


trace

方法内部调用路径,并输出方法路径上的每个节点上耗时。可以帮助找到程序中执行慢的代码,优化性能

基本用法

trace 类路径 方法名
在这里插入图片描述

按照时间过滤

trace 类路径 方法名 '#cost>时间(ms)'
可以看到过滤以后,观察到的都是时间大于0.5ms的该方法的调用
Arthas的thread、trace命令_第4张图片

trace多个类或者多个函数

trace命令只会trace匹配到的函数里的子调用,并不会向下trace多层。因为trace是代价比较贵的,多层trace可能会导致最终要trace的类和函数非常多。

可以用正则表匹配路径上的多个类和函数,一定程度上达到多层trace的效果。(注意-E参数)
trace -E com.test.ClassA|org.test.ClassB method1|method2|method3

你可能感兴趣的:(JAVA,开发工具,java,arthas)