JAVA · 성능/JVM
스레드 덤프 분석
스레드 덤프로 데드락, 병목, 스레드 상태를 진단합니다.
성능/JVM고급ThreadDump데드락jstack스레드분석
핵심 설명
스레드 덤프로 데드락, 병목, 스레드 상태를 진단합니다.
Java code
// 스레드 덤프 생성
// jcmd <pid> Thread.print
// jstack <pid>
// kill -3 <pid> (Unix)
import java.lang.management.*;
public class ThreadDumpAnalysis {
public static void main(String[] args) throws Exception {
// 데드락 시뮬레이션용 잠금 객체
Object lock1 = new Object();
Object lock2 = new Object();
Thread t1 = new Thread(() -> {
synchronized (lock1) {
try { Thread.sleep(100); } catch (InterruptedException e) {}
synchronized (lock2) { System.out.println("T1 완료"); }
}
}, "Thread-A");
Thread t2 = new Thread(() -> {
synchronized (lock2) {
try { Thread.sleep(100); } catch (InterruptedException e) {}
synchronized (lock1) { System.out.println("T2 완료"); }
}
}, "Thread-B");
t1.start();
t2.start();
Thread.sleep(500);
// 프로그래밍 방식으로 스레드 정보 확인
ThreadMXBean tmx = ManagementFactory.getThreadMXBean();
// 데드락 감지
long[] deadlocked = tmx.findDeadlockedThreads();
if (deadlocked != null) {
System.out.println("데드락 감지!");
for (ThreadInfo info : tmx.getThreadInfo(deadlocked, true, true)) {
System.out.println(info);
}
}
// 전체 스레드 상태
for (ThreadInfo info : tmx.dumpAllThreads(true, true)) {
System.out.printf("%s [%s]%n", info.getThreadName(), info.getThreadState());
}
}
}학습 팁
스레드 덤프를 3~5초 간격으로 3회 이상 수집하면 동일 위치에서 멈춘 스레드를 찾아 병목을 진단할 수 있습니다.
주의할 점
BLOCKED 상태 스레드가 많으면 잠금 경합이 심한 것입니다. synchronized를 ReentrantLock이나 ConcurrentHashMap으로 대체를 고려하세요.
자주 묻는 질문
스레드 덤프 분석란 무엇인가요?
스레드 덤프로 데드락, 병목, 스레드 상태를 진단합니다.
스레드 덤프 분석 학습 시 주의할 점은 무엇인가요?
BLOCKED 상태 스레드가 많으면 잠금 경합이 심한 것입니다. synchronized 를 ReentrantLock 이나 ConcurrentHashMap 으로 대체를 고려하세요.
Continue Learning
Java 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.