前言
关于fastthread的介绍直接看官方主页就行:
支撑核心转储剖析、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看看对比一下。
运用
翻开官网主页挑选文件即可。
线程计数摘要
各种线程状况能够参考笔者之前的文章。
NEW(尚未启动的线程)、RUNNABLE(履行中的线程)、BLOCKED(堵塞的线程,比方等待一个synchronized锁)、WAITING(无限期等待另一个线程)、TIMED_WAITING(在指定时间内等待)、TERMINATED(现已退出的线程)
线程组
8个GC Task线程,2个Thread线程,能够点进去看看这两个线程:
能够看到便是咱们new出来的。
看护 vs 非看护线程
- 看护线程:
能够看到许多RMI、JMX、C1、C2线程,笔者也不是很清楚,搜到一些材料贴在文末。
- 非看护线程:
能够看到new出来的线程、main线程、VM和GC相关的线程都对错看护线程。
死锁
具有相同stack trace的线程
- 看看最多的:
VM和GC相关,没有stack trace
- block的
最终履行的方法
CPU耗费线程
堵塞线程-传递图
GC线程
gc线程数正常
线程仓库深度
能够看到递归问题
复杂死锁
Finalizer Thread
反常
火焰图
最下面为root,下到上看到调用链,能够点开:
自下而上调用栈树
总结
能够看到,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 天,点击查看活动详情