PHpullh
학습 라이브러리/Java/스레드 덤프 분석

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 상태 스레드가 많으면 잠금 경합이 심한 것입니다. synchronizedReentrantLock이나 ConcurrentHashMap으로 대체를 고려하세요.

자주 묻는 질문

스레드 덤프 분석란 무엇인가요?

스레드 덤프로 데드락, 병목, 스레드 상태를 진단합니다.

스레드 덤프 분석 학습 시 주의할 점은 무엇인가요?

BLOCKED 상태 스레드가 많으면 잠금 경합이 심한 것입니다. synchronized 를 ReentrantLock 이나 ConcurrentHashMap 으로 대체를 고려하세요.

Continue Learning

Java 학습을 이어가세요

총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.