前言

关于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看看对比一下。

fastthread使用

fastthread使用

运用

翻开官网主页挑选文件即可。

线程计数摘要

fastthread使用

各种线程状况能够参考笔者之前的文章。

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

线程组

fastthread使用
8个GC Task线程,2个Thread线程,能够点进去看看这两个线程:

fastthread使用
能够看到便是咱们new出来的。

看护 vs 非看护线程

fastthread使用

  • 看护线程:

fastthread使用

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

  • 非看护线程:

fastthread使用

能够看到new出来的线程、main线程、VM和GC相关的线程都对错看护线程。

死锁

fastthread使用

具有相同stack trace的线程

fastthread使用

fastthread使用

  • 看看最多的:

fastthread使用
VM和GC相关,没有stack trace

  • block的

fastthread使用

最终履行的方法

fastthread使用

CPU耗费线程

fastthread使用

堵塞线程-传递图

fastthread使用

GC线程

fastthread使用
gc线程数正常

线程仓库深度

fastthread使用

能够看到递归问题

复杂死锁

fastthread使用

Finalizer Thread

fastthread使用

反常

fastthread使用

火焰图

fastthread使用
最下面为root,下到上看到调用链,能够点开:

fastthread使用

自下而上调用栈树

fastthread使用

总结

能够看到,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 天,点击查看活动详情