fastthread使用

1,890 阅读3分钟

前言

关于fastthread的介绍直接看官方首页就行:

  1. 及时根本原因分析
  2. 在线线程转储分析
  3. 出色的UI
  4. 线程转储分析REST API
  5. 通用的Java线程转储分析器

支持核心转储分析、hs_err_pid文件分析,这个笔者也不知道,后面再了解下

举个例子

package com.study.fastthread;

import lombok.SneakyThrows;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;

public class DeadLockDemon {
    @SneakyThrows
    public static void main(String[] args) {
        DeadLockTask deadLockTask = new DeadLockTask();
        //多线程模拟死锁
        Thread threadA = new Thread(deadLockTask);
        Thread threadB = new Thread(deadLockTask);

        threadA.start();
        threadB.start();

        threadA.join();
    }

    private static class DeadLockTask implements Runnable {
        private Object lockA = new Object();
        private Object lockB = new Object();
        private AtomicBoolean flag = new AtomicBoolean(false);

        @SneakyThrows
        @Override
        public void run() {
            if (flag.compareAndSet(false, true)) {
                synchronized (lockA) {
                    TimeUnit.SECONDS.sleep(2);
                    synchronized (lockB) {
                        System.out.println("死锁内部代码");
                    }
                }
            } else {
                synchronized (lockB) {
                    TimeUnit.SECONDS.sleep(2);
                    synchronized (lockA) {
                        System.out.println("死锁内部代码");
                    }
                }
            }
        }
    }
}

笔者之前使用visual vm,所以打开看看,一目了然,可以dump下来(也可以使用jstack -l <pid>)使用fastthread看看对比一下。

image.png

image.png

使用

打开官网首页选择文件即可。

线程计数摘要

image.png

各种线程状态可以参考笔者之前的文章

NEW(尚未启动的线程)、RUNNABLE(执行中的线程)、BLOCKED(阻塞的线程,比如等待一个synchronized锁)、WAITING(无限期等待另一个线程)、TIMED_WAITING(在指定时间内等待)、TERMINATED(已经退出的线程)

线程组

image.png 8个GC Task线程,2个Thread线程,可以点进去看看这两个线程:

image.png 可以看到就是我们new出来的。

守护 vs 非守护线程

image.png

  • 守护线程:

image.png

可以看到很多RMI、JMX、C1、C2线程,笔者也不是很清楚,搜到一些资料贴在文末。

  • 非守护线程:

image.png

可以看到new出来的线程、main线程、VM和GC相关的线程都是非守护线程。

死锁

image.png

具有相同stack trace的线程

image.png

image.png

  • 看看最多的:

image.png VM和GC相关,没有stack trace

  • block的

image.png

最后执行的方法

image.png

CPU消耗线程

image.png

阻塞线程-传递图

image.png

GC线程

image.png gc线程数正常

线程堆栈深度

image.png

可以看到递归问题

复杂死锁

image.png

Finalizer Thread

image.png

异常

image.png

火焰图

image.png 最下面为root,下到上看到调用链,可以点开:

image.png

自下而上调用栈树

image.png

总结

可以看到,fastthread各方面都比visual vm详细,除了没有展示线程运行时间。 但是有时候多了也不容易发现问题,所以我们需要知道因为线程相关导致的问题有哪些,然后对应去看,比如:

  • 某个接口一直没有响应,但是各项资源都充足,可以去看看死锁
  • 所有接口都响应很慢,可以先看看线程计数摘要,看看是不是线程数超标,那部分超标可以看看线程组,再细看下是那部分代码占用了很多可以看看具有相同stack trace的线程,或者直接看最后执行的方法,有时候并不是因为某个线程本身发生了阻塞而是因为其他线程,可以看看阻塞线程-传递图
  • CPU飙升,可以看看CPU消耗线程
  • 内存泄漏了,看看GC线程是否正常,Finalizer Thread是否正常。
  • 堆栈溢出,可以看看线程栈深度
  • 需要具体的分析可以看看自下而上调用栈树

相关资料

FastThread 相关的工具介绍:欲穷千里目,更上一层楼

fastthread

hs_err_pid.log日志,有趣的两个Jvm参数

Generating a Java Core Dump

Thread.join() 的使用

理解Java RMI 一篇就够

JIT即时编译器(C1和C2)

什么是JMX?

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 8 天,点击查看活动详情