변수의 기록

자바 스레드 덤프(Thread Dump) 분석 방법 본문

자바/자바

자바 스레드 덤프(Thread Dump) 분석 방법

불광동 물주먹 2025. 4. 13. 02:01

 

1. 스레드 덤프란?

스레드 덤프는 실행 중인 자바 애플리케이션의 모든 스레드 상태를 출력한 스냅샷이다.
서버에서 응답 지연, 무한 대기, CPU 사용률 급증, 데드락 등이 발생했을 때, 그 원인을 파악하기 위한 주요 도구로 사용된다.

스레드 덤프를 분석하면 다음을 확인할 수 있다:

  • 현재 어떤 스레드가 실행 중인지
  • 어떤 스레드가 락을 점유하고 있는지, 어떤 스레드가 락을 기다리고 있는지
  • 데드락 여부락 경합 병목 구간

2. 스레드 덤프 생성 방법

2.1 jstack 명령어 (권장)

jps           # 현재 실행 중인 Java 프로세스 ID 확인
jstack <PID>  # 스레드 덤프 출력
jstack <PID> > threaddump.txt  # 파일로 저장

2.2 kill -3 (Linux/UNIX/macOS)

kill -3 <PID>

 

  • JVM에 SIGQUIT 시그널을 보내면 표준 출력(stdout) 으로 스레드 덤프가 출력됨
  • 톰캣 등의 경우 catalina.out 로그에 출력됨

2.3 IntelliJ, Eclipse 등 IDE 도구

  • 디버깅 중인 애플리케이션에 한해 IDE에서 스레드 덤프를 생성 가능
  • IntelliJ: Run > "Thread Dump"
  • Eclipse: Console 우클릭 > "Thread Dump"

3. 스레드 상태 요약

 

상태 설명 발생 예시
RUNNABLE 실행 중 또는 실행 대기 중 CPU 점유 중, 무한 루프
WAITING 다른 스레드의 동작을 무한히 기다림 Object.wait(), Thread.join()
TIMED_WAITING 일정 시간 동안 대기 Thread.sleep(), wait(timeout)
BLOCKED synchronized 진입 실패로 락 대기 중 동시성 병목, 데드락 가능성

4. 스레드 덤프 예시 (일부)

 
"Thread-5" #18 prio=5 os_prio=0 tid=0x00007fcd2c1b7800 nid=0x5e03 waiting on condition [0x00007fcd1c3f9000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at com.example.service.TaskProcessor.process(TaskProcessor.java:42)

"Thread-6" #19 prio=5 os_prio=0 tid=0x00007fcd2c2b7800 nid=0x5e04 BLOCKED (on object monitor)
   java.lang.Thread.State: BLOCKED (on object monitor)
        at com.example.service.TaskProcessor.process(TaskProcessor.java:42)
  • Thread-5는 wait() 중 (WAITING)
  • Thread-6은 Thread-5가 점유한 모니터 락을 기다리는 상태 (BLOCKED)

5. 데드락 감지 사례

자바의 jstack은 데드락이 발생했을 경우 아래와 같이 명확하게 표시해 준다.

 
Found one Java-level deadlock:
=============================
"Thread-1":
  waiting to lock monitor 0x000000001c2c1234 (object 0x000000076b1a1a00),
  which is held by "Thread-2"
"Thread-2":
  waiting to lock monitor 0x000000001c2c5678 (object 0x000000076b1a1a90),
  which is held by "Thread-1"

해석

  • Thread-1은 Thread-2가 점유한 락을 기다리고 있음
  • Thread-2는 Thread-1이 점유한 락을 기다리고 있음
  • → 서로 락을 주고받으며 순환 대기 상태가 되어 데드락 발생

6. 마무리


 

항목 설명
목적 병목, 무한 대기, 데드락, 락 경합 등의 원인 분석
생성 방법 jstack, kill -3, IDE 도구
분석 포인트 스레드 상태, 락 점유 여부, 데드락 유무