thread 덤프를 획득 했다면 분석을 해보자.
툴을 이용하자.
SUM JDK : TDA , visualvm 플러그인으로도 사용 가능 하다.
IBM JDK : TMDA
jar 하나이고 java -Xmx500m -jar jca455.jar > 이런식으로 실행할 수 있다.
thread 덤프를 확인해 보자
전체적인 문제라면
전체에서 사용하는 객체에서 lock이 있거나 threadpool을 차서 더이상 요청을 처리할 수 없을때.
특정 동작이 문제라면
해당 Thread를 찾아 stack trace로 확인한다.
1. 전체 thread 숫자 와 상태 확인 (IBM JDK의 경우 더많은 시스템 정보를 제공한다.)
- 전체 thread가 was에서 허용 가능한 자원을 다 썼다면 해당 웹 어플리케이션은 응답이 없을 것이다.
2. 각 thread의 상태 확인.
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의 응답을 기다리는지
등등
'JAVA' 카테고리의 다른 글
톰캣의배신 : Tomcat의 jsp 백업내용 적용시 jsp 적용 안되는 현상. 롤백 안됨. (0) | 2014.10.08 |
---|---|
스레드덤프(thread dump) 획득방법. (0) | 2014.08.28 |
도메인이 같고 port 가 다른 JAVA 어플리케이션의 세션 충돌 (1) | 2014.05.09 |
[JAVA] sealing violation (0) | 2014.04.17 |
[JUNIT] 실행순서 (0) | 2014.04.17 |