thread 덤프를 획득 했다면 분석을 해보자.


툴을 이용하자. 

SUM JDK :  TDA , visualvm 플러그인으로도 사용 가능 하다.

IBM JDK : TMDA 

jar 하나이고 java -Xmx500m -jar jca455.jar > 이런식으로 실행할 수 있다. 

TMDA :http://pic.dhe.ibm.com/infocenter/isa/v4r1m0/index.jsp?topic=%2Fcom.ibm.esupport.tool.tmda.doc%2Fdocs%2Freadme.htm


thread 덤프를 확인해 보자


전체적인 문제라면 

전체에서 사용하는 객체에서 lock이 있거나 threadpool을 차서 더이상 요청을 처리할 수 없을때. 

특정 동작이 문제라면 

해당 Thread를 찾아 stack trace로 확인한다.


1. 전체 thread 숫자 와 상태 확인 (IBM JDK의 경우 더많은 시스템 정보를 제공한다.)

- 전체 thread가 was에서 허용 가능한 자원을 다 썼다면 해당 웹 어플리케이션은 응답이 없을 것이다.

2. 각 thread의 상태 확인.

NEW: 새로운 쓰레드로 아직 시작되지 않음
RUNNABLE: JVM이 동작중. 이는 항상 동장하고 있다는 것은 아님. 리소스 획득을 위해서 잠시 대기 중일 수 있다.
BLOCKED: 쓰레드가 synchronized block 혹은 method에 진입하기 위해 대기.
WAITING: 대기 상태로 다른 쓰레드가 작업 중임을 의미. 이는 Object.wait 메소드 호출 후에도 진입되는 상태
TIMED_WAITING: 쓰레드가 특정 시간을 대기함을의미. 이는 Thread.sleep(), Object.wait()로 시간 인자가 들어간 메소드가 호출될때 진입되는 상태. 혹은 LockSupport, ParkNanos, LockSupport, ParkUntil 메소드도 동일
TERMINATED: run 메소드에서 빠져나온 경우 또는 예외가 발생하여 빠져나온 경우

데드락이 없는지 BLOCKED나 WAIT를 유심히 확인한다.

thread는 각각 고유한 정보인 THreadID를 가지고 있다. 문제가 있는 Thread 우선 확인해야 한다. 


Thread 덤프는 한 시점에 대한 정보이므로 여러번 수집하여 어떻게 동작하는지 확인해야 하는 경우도 있다.

3. thread의 stack trace를 유심히 보자.  (아래와 같은 상황을 찾을 수 있다.)

- 어떤 메서드를 실행 중인지

- 어떤 메서드에서 대기중인지 (해당 메서드에 동기화 처리가 되어있는지 확인해 본다)

- DB 풀을 기다리는지 

- DB의 응답을 기다리는지 

등등 

Posted by 마법수정화살
,