Thread dump란 JVM에서 사용하는 thread들에 대한 dump를 의미한다. 즉 JAVA process에 속한 모든 thread들의 상태를 기록한 것이다.
Thread dump를 확인하는 경우는 다음과 같다. (참고: https://mkil.tistory.com/54)
1. 해당 application에서 현재 어떤 thread 부분이 어떻게 수행하고 있는지에 대한 stack을 확인하기 위함.
2. process가 hang 상태이거나, 응답 시간이 지연되거나, CPU를 많이 점유하는 thread가 있는 경우, 확인하기 위함.
3. thread dump는 stack 정보를 확인하기에, 한 시점의 정보만 보는 것이 아닌, 5초 간격으로 최소한 3번 thread dump를 뜨는 것을 권장한다. 이는 stack trace의 변화되는 정보를 확인하기 위함이다.
즉, Web Server에서는 동시에 많은 수의 사용자를 처리하기 위해 수백 개에 이르는 thread를 사용하며, 2개 이상의 thread가 같은 자원을 사용할 경우 필연적으로 thread 간에 Contention(경합)이 발생하고 이는 Deadlock 상태까지 발전할 수 있다. Deadlock이란 2개 이상의 thread에서 작업을 완료하기 위해서 상대의 작업이 끝나야 하는 상황을 의미한다. 이러한 Thread Contention은 다양한 문제를 발생하며, Thread Dump를 분석하여 thread 상태를 정확히 파악하는 것이 필요하다. (참고 : https://d2.naver.com/helloworld/10963)
============================================================================
Thread dump 상태 분석
Thread dump의 상태는 java.lang.Thread 클래스 내부에 state으로 선언되어 있다.
상태 | 설명 |
NEW | thread는 생성됨. 그러나 아직 실행되지 않은 상태 |
BLOCKED | Monitor를 획득하기 위해 다른 thread가 lock을 해제하기를 기다리는 상태 |
RUNNABLE | 현재 CPU를 점유하고 작업을 수행 중인 상태 |
WAITING | thread가 wait(), join(), park() method를 통해 기다리는 상태 |
TIME_WAITING | thread가 sleep(), wait(), join(), park() method를 통해 기다리는 상태 |
TERMINATED | thread가 종료된 상태 |
※ Monitor : JAVA는 Monitor를 통해 thread를 동기화하며, 모든 JAVA 객체는 하나의 Monitor를 가지고 있다. 특정 thread가 소유한 Monitor를 다른 thread가 획득하려면 Wait Queue에서 대기하다가, 기존 thread가 해제되면 그때 획득해야 된다.
※ WAITING vs TIME_WAITING
TIME_WAITING은 WAITING과 대부분 유사하나, WAITING과는 달리 maximum waiting time이 method의 인수로 저장되어 있어서, 외부적 요인 뿐만 아니라 시간에 의해서도 WAITING이 해제될 수 있음.
============================================================================
Thread dump 생성 방법
Thread dump는 stdout(표준 출력)으로 출력이 된다. Weblogic같은 경우 nohup으로 redirection해서 nohup log에 쌓이게 설정한다. IBM 계열의 경우 javacore 파일을 생성시켜 출력하게 되며, java -Xdump:java:defaults 명령어를 통해 파일 위치를 파악할 수 있다.
Thread dump는 Unix계열 (Sun, Linux, AIX 등) 은 kill -3 [PID] , Window계열은 java 프로세스 창에서CTRL + Break key로 생성 가능하다. 또는 jstack [PID]는 UNIX/LINUX/Windows에서 사용이 가능하다(JDK 1.6 이상 지원).
※ kill -3 [PID]
ps -ef 명령어를 통해 PID 추출.
이후 kill -3 PID 입력하면 stdout으로 thread dump 생성됨 (nohup log에서 확인 가능)
※ jstack [PID]
{JAVA_HOME}/bin 안의 jsp 파일을 통해 PID 획득(JAVA application process PID)
jsp -v
이후 jstack PID를 통해 thread dump 생성됨.
============================================================================
'JAVA > JAVA' 카테고리의 다른 글
AlwaysPreTouch JVM option (0) | 2022.05.18 |
---|---|
ClassLoader (0) | 2022.05.10 |
Virtual Host (0) | 2022.03.15 |
JVM memory 구조 (0) | 2022.02.28 |
JAVA option - urandom option (0) | 2022.01.24 |