본문 바로가기
우아한 코딩

스레드 덤프(Thread Dump)란 무엇인가?

by 피크인사이트 2024. 2. 28.
반응형

자바 애플리케이션에서 발생하는 스레드와 관련된 문제를 해결하기 위해 필요한 도구 중 하나가 스레드 덤프(Thread Dump)입니다.

이번 글에서는 자바 애플리케이션의 안정성과 성능을 보장하기 위해 매우 중요 스레드 덤프의 개념과 분석 방법에 대해 살펴보겠습니다.

스레드 덤프(Thread Dump)란?


1. 스레드 덤프 개요

정의

자바 스레드 덤프(Java Thread Dump)는 특정 시점에 자바가상머신(JVM) 내의 모든 실행 중인 스레드의 상태 정보를 스냅샷 형태로 기록한 것으로 JVM 내부 동작을 살펴보고 문제를 진단하는 데 유용한 도구입니다.

스레드 덤프에는 다음과 같은 정보가 포함됩니다.

  • 스레드 ID: 각각의 스레드를 식별하는 고유 번호
  • 스레드 이름: 개발자가 직접 지정한 스레드 이름
  • 스레드 상태: 실행중(RUNNABLE), 대기중(WAITING), 블록킹(BLOCKED) 등 스레드의 현재 상태
  • 스택 추적: 스레드가 실행 중인 메서드 호출 경로
  • 보유 자원: 스레드가 보유하고 있는 락, 모니터 등의 자원 정보

생성방법

1) JVM 도구 사용

  jstack이라는 JVM 도구를 이용하여 스레드덤프를 생성할 수 있습니다.

이 도구는 JDK에 포함되어 있으며 사용 방법은 다음과 같습니다

  jstack -l [PID]   // [PID]는 스레드 덤프를 생성하려는 Java 프로세스의 ID

 

2) OS 명령어 사용

OS 명령어를 사용하여 스레드 덤프를 생성할 수도 있습니다.

리눅스에서는 kill -3 [PID] 명령어를 사용하고,

윈도우에서는 Ctrl + Break 키를 사용합니다.

 

3) 프로그램 내부에서 생성

Java 프로그램 내부에서 Thread.getAllStackTraces() 메서드를 호출하여 모든 스레드에 대한 스택 트레이스를 가져올 수 있습니다.

 

4) APM 도구 사용

APM(Application Performance Management) 도구를 사용하여 스레드 덤프를 생성하고 분석할 수 있습니다.

 

스레드 덤프를 생성한 후에는 이를 분석하여 프로그램의 성능 문제를 진단하거나 버그를 찾을 수 있습니다.

 

구성 요소

스레드 덤프의 주요 구성 요소는 다음과 같습니다

1) 스레드 상태

스레드의 상태는 java.lang.Thread 클래스 내부에 State라는 이름의 Enumerated Types 으로 선언되어 있습니다.

스레드 상태에는 다음과 같은 것들이 있습니다

  • NEW: 스레드가 새로 생성되었으나 아직 미실행 상태
  • RUNNABLE: 현재 CPU를 점유하며 작업 중인 상태
                          운영체제의 자원 분배로 WAITING 상태가 될 수도 있음
  • BLOCKED: 다른 스레드가 락을 해제하기를 기다리는 상태( Monitor를 획득하기 위함)
  • WAITING: join(), wait(),  park() 메서드로 대기 중인 상태
  • TIMED_WAITING: WAITING과 유사하지만 정해진 시간만 대기 함. 대기(waiting) 상태와의 차이점은 최대 대기 시간을 명시할 수 있기 때문에 외부적인 변화뿐만 아니라 시간에 의해서도 대기(waiting) 상태가 해제될 수 있다는 것
  • TERMINATED: 종료 상태 

 

2) 스레드 정보

스레드 덤프는 각 스레드의 정보를 포함하고 있습니다.

이 정보에는 스레드의 ID, 이름, 상태, 스택 트레이스 등이 포함됩니다

 

3) 락 정보

스레드 덤프는 스레드가 현재 획득하고 있는 락, 대기 중인 락 등의 정보를 포함하고 있습니다

 

4) 스레드 종류

스레드 덤프는 스레드가 데몬 스레드인지 비데몬 스레드인지에 대한 정보를 포함하고 있습니다


2. 스레드 덤프 분석 방법

1)  분석 단계

스레드 덤프 분석단계는 '스레드 덤프 생성 > 분석 > 문제 파악 > 해결방안' 순으로 진행합니다.

  • 스레드 덤프 생성: jstack, jmap, VisualVM 등을 사용하여 스레드 덤프 파일을 생성합니다.
  • 스레드 덤프 파일 분석: 텍스트 편집기나 전용 도구를 사용하여 스레드 덤프 파일을 분석합니다.
  • 문제점 파악: 스레드 상태, 스택 추적, 보유 자원 등을 분석하여 문제점을 파악합니다.
  • 해결 방안 도출: 문제점에 대한 해결 방안을 도출하고 적용합니다.

2) 주요 분석 항목 및 의미 해석

스레드 덤프파일을 분석하기 위한  주요 항목과 의미는 다음과 같습니다.

  • 스레드 ID: 각각의 스레드를 식별하는 고유 번호
  • 스레드 이름: 개발자가 직접 지정한 스레드 이름
  • 스레드 상태: NEW,  RUNNABLE, BLOCKED, WAITING, TIMED_WAITING,  TERMINATED
  • 스택 추적: 스레드가 실행 중인 메서드 호출 경로
  • 보유 자원: 스레드가 보유하고 있는 락, 모니터 등의 자원 정보

3) 일반적인 문제 진단 및 해결 방안

 스레드 덤프를 이용한 일반적인 문제 진단 및 해결 방안은 다음과 같습니다.

  • 성능 문제: 애플리케이션이 느려졌을때, 스레드 덤프를 분석하여 성능 문제를 진단할 수 있습니다. 예를 들어 CPU 사용률이 비정상적일때 스레드 덤프를 분석하여 문제를 파악할 수 있습니다.
  • 데드락 문제: 둘 이상의 스레드가 서로 락을 기다리는 상황을 데드락이라고 하는데 스레드 덤프를 분석하여 데드락이 발생한 원인을 찾을 수 있습니다.
  • 스레드 경합 문제: 두 개 이상의 스레드가 동일한 자원을 이용할 때에는 스레드 간에 경합이 필연적으로 발생하는데 스레드 덤프를 분석하여 경합이 발생한 원인을 찾을 수 있습니다.
  • 응답 없음 문제: 애플리케이션이 응답하지 않는 경우, 스레드 덤프를 분석하여 문제를 진단할 수 있습니다. 예를 들어, shutdown hook을 날렸는데도 종료되지 않고 응답 없는 상태로 기다리는 것을 확인하였다면, 스레드 덤프를 분석하여 문제를 파악할 수 있습니다.

3. 스레드 덤프 분석 도구

자바 스레드 덤프 분석 도구는 다양한 목적과 환경에 맞게 제공되며, 주요 도구로는 VisualVM, jstack, jcmd, jmap, TDA(Thread Dump Analyzer), FastThread 등이 있습니다.

각 도구의 주요 기능과 장단점은 다음과 같습니다

도구 주요 기능 장점 단점
VisualVM 시각적 모니터링, 프로파일링, 스레드 덤프 생성 및 분석 직관적 사용자 인터페이스, 다양한 기능 제공 성능 저하 가능성, 대규모 애플리케이션에 적합하지 않을 수 있음
jstack 명령행에서 스레드 덤프 생성 및 분석 간단하고 빠른 스레드 덤프 생성 가능 시각적 분석 기능 제한적
jcmd JVM 관리 작업 수행, 스레드 덤프 생성 및 분석 다양한 관리 작업 수행 가능 시각적 분석 기능 부족
jmap 힙 및 스레드 덤프 생성 힙 및 스레드 덤프 생성에 효과적 스레드 덤프의 분석 기능 부족
TDA 스레드 덤프 파일 분석하여 상태 진단 시각적으로 스레드 덤프 분석 가능 스레드 덤프 파일을 가져와야 함, 실시간 분석 기능 부족
FastThread 스레드 덤프 파일을 실시간으로 분석하여 진단 실시간 분석 가능 유료 도구, 가격 상이할 수 있음

마치며

스레드 덤프는 JVM 내에서 실행 중인 모든 스레드의 상태와 정보를 스냅샷으로 캡처하여 제공하기 때문에 이를 통해 애플리케이션의 상태를 분석하여 문제 해결이 가능합니다.

스레드 덤프를 분석하는 것은 자바 애플리케이션의 성능과 안정성을 보장하기 위해 매우 중요합니다.

올바른 스레드 덤프 분석을 통해 데드락, 스레드 풀 문제, 메모리 누수 등과 같은 다양한 스레드 관련 문제를 식별하고 해결할 수 있기에 자바 개발자는 스레드 덤프 분석에 대한 충분한 이해가 필요하며, 이를 통해 더 나은 애플리케이션을 구축할 수 있습니다.

다음 시간에는 스레드 덤프를 분석하는 실제 사례를 들어 좀 더 자세하게 알아보겠습니다.

감사합니다.

반응형