2022. 12. 18. 20:25ㆍ카테고리 없음
스레드 덤프란?
- JVM 내부에서 현재 수행 중인 스레드의 SnapShot을 텍스트로 출력
- 서버 Hang, 서버 Slowdown 등 서버에서 발생하는 문제를 해결하는 가장 유용한 도구
- WAS Trouble Shooting에 필요한 다양한 데이터를 제공 합니다.
스레드 덤프가 왜 필요 한가요?
- DB 쿼리가 느릴 때
- HTTP 호출이 느릴 때
- Logging 처리가 느릴 때
- 파일 I/O가 느릴 때
- Lock이 걸릴 때
웹 서버에서는 많은 수의 동시 사용자를 처리하기 위해 수십~수백 개 정도의 스레드를 사용한다. 두 개 이상의 스레드가 같은 자원을 이용할 때는 필연적으로 스레드 간에 경합(Contention)이 발생하고 경우에 따라서는 데드락(Deadlock)이 발생할 수도 있다.
경합이란 어떤 스레드가 다른 스레드가 획득하고 있는 락(lock)이 해제되기를 기다리는 상태를 말한다. 웹 애플리케이션에서 여러 스레드가 공유 자원에 접근하는 일은 매우 빈번하다. 대표적으로 로그를 기록하는 것도 로그를 기록하려는 스레드가 락을 획득하고 공유 자원에 접근하는 것이다.
데드락은 스레드 경합의 특별한 경우인데, 두 개 이상의 스레드에서 작업을 완료하기 위해서 상대의 작업이 끝나야 하는 상황을 말한다.
스레드 경합 때문에 다양한 문제가 발생할 수 있으며, 이런 문제를 분석하기 위해서는 스레드 덤프(Thread Dump)를 이용한다. 각 스레드의 상태를 정확히 알 수 있기 때문이다.
스레드 덤프 획득 하는 방법?
- Unix : kill -3 [PID]
- window : Ctrl + Break
- 공통 : jstack [PID]
- jstack 이용 /JDK 1.6이상 사용시 가능 / 참고: https://ktdsoss.tistory.com/437
- 반드시 생성시 3~5회 연속으로 생성하여 문제 상황에 대한 변화 과정을 확인


그림 1 스레드 상태
- NEW: 스레드가 생성되었지만 아직 실행되지 않은 상태
- RUNNABLE: 현재 CPU를 점유하고 작업을 수행 중인 상태. 운영체제의 자원 분배로 인해 WAITING 상태가 될 수도 있다.
- BLOCKED: Monitor를 획득하기 위해 다른 스레드가 락을 해제하기를 기다리는 상태
- WAITING: wait() 메서드, join() 메서드, park() 메서드 등를 이용해 대기하고 있는 상태
- TIMED_WAITING: sleep() 메서드, wait() 메서드, join() 메서드, park() 메서드 등을 이용해 대기하고 있는 상태. WAITING 상태와의 차이점은 메서드의 인수로 최대 대기 시간을 명시할 수 있어 외부적인 변화뿐만 아니라 시간에 의해서도 WAITING 상태가 해제될 수 있다는 것이다
쓰레드 분석 툴
1. JDK :jvisualVM
2.웹 사이트:
Smart Java thread dump analyzer - thread dump analysis in seconds (fastthread.io)
fastthread.io
Thread Dump Analysis REST API In this modern world, thread dumps are still analyzed in a tedious & manual mode. i.e., Operations engineer captures thread dumps from the production servers; then he transmits those files to developers. Developers use thread
fastthread.io