Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- synchronizeation
- tree
- linkedmap
- HashMap
- 코딩테스트
- 쓰레드 덤프
- black-red
- Red-Black
- 유저 쓰레드
- 알고리즘
- set
- OS
- 커널모드
- 트리
- 유저모드
- 코테
- 배열
- list
- avl
- os 쓰레드
- Java
- 스케줄링
- cpu
- Lock
- 프로그래머스
- 쓰레드
- MAP
- 하드웨어 쓰레드
- non-blocking
- 자바
Archives
변수의 기록
자바 스레드 덤프(Thread Dump) 분석 방법 본문
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 도구 |
분석 포인트 | 스레드 상태, 락 점유 여부, 데드락 유무 |
'자바 > 자바' 카테고리의 다른 글
(Java) Set의 구조와 활용 - ADT 관점으로 이해 (0) | 2025.04.23 |
---|---|
(Java) Map 구조 정리 - ADT 관점에서의 이해 (****별 다섯개****) (0) | 2025.04.23 |
(java) 기본 배열(Array), 동적 배열(Dynamic Array), 연관 배열(Associative Array)의 개념과 내부 동작 원리를 설명 (0) | 2025.04.22 |
Java Map 컬렉션 정리 – HashMap, LinkedHashMap, TreeMap (0) | 2025.04.21 |
(java) 인터페이스 왜 쓸까? (0) | 2025.03.27 |