서버에 문제가 생겼을 때 적절한 도구를 사용하여 분석할 수 있어야 하는데 이에 대한 내용을 간단히 알아보고 정리해보자.
Thread Dump는 JVM에서 실행 중인 모든 스레드의 상태와 스택 트레이스를 한눈에 볼 수 있는 스냅샷이다. 즉, 현재 어떤 스레드가 무엇을 하고 있는지를 보는 도구이다.
| 상황 | 설명 | 상태 |
|---|---|---|
| CPU 사용량 100% | CPU 바운드 작업이 많을 때 | RUNNABLE |
| thread busy / executor active count 가 높은 경우 | 스레드 풀이 꽉 찼을 때 | RUNNABLE / WAITING |
| 처리 속도가 매우 느림 | 락 경쟁, I/O 블로킹 가능 | BLOCKED / WAITING |
| DB 커넥션 부족 | 커넥션 풀 점유 | WATING |
| 특정 API만 타임 아웃 | 락 또는 외부 API 대기 | BLOCKED / WAITING |
stateDiagram-v2
[*] --> NEW
NEW --> RUNNABLE
RUNNABLE --> BLOCKED : synchronized 대기
RUNNABLE --> WAITING : wait(), join()
RUNNABLE --> TIMED_WAITING : sleep(), wait(timeout)
BLOCKED --> RUNNABLE
WAITING --> RUNNABLE
TIMED_WAITING --> RUNNABLE
RUNNABLE --> TERMINATED
| 상태 | 의미 | 언제 발생? | 주의 포인트 |
|---|---|---|---|
| RUNNABLE | 실행 중 / 대기 중 | CPU 작업 | CPU 100% 시 확인 |
| BLOCKED | synchronized 진입 대기 | 락 경쟁 | 다수 발생 시 문제 |
| WAITING | 다른 스레드 신호 대기 | wait(), join() | 데드락 의심 |
| TIMED_WAITING | 일정 시간 대기 | sleep(), wait(timeout) | 정상적 대기 |
| TERMINATED | 스레드 종료 | 완료됨 | 무시 가능 |