티스토리 뷰

JVM hang 걸렸을 때 thread dump 남기는 법

행복한아빠 2009.11.26 21:50
Java 애플리케이션이 상태가 안좋거나 멈추었을때 JVM에서 무슨일이 벌어지고 있는지 정확히 찾는 방법으로 thread dump를 수행하면 아주 유용합니다. 특히 어떤 코드가 무한 루프 돌던가 어떤 코드블럭을 나오지 못할 경우 거의 바로 찾을 수 있습니다.




Thread dump가 무한루프나 코드블럭을 빠져나오지 못하는 곳을 바로 표시하거나 하는건 아니고 thread dump 남길 당시의 각 쓰레드의 stack trace를 보여주어 그 당시 수행하고 있는 java 메소드를 볼 수 있습니다. 문제를 풀 수 있는 좋은 출발점이 될 수 있습니다.
한 시점의 JVM 쓰레드의 각 stack 상태를 보는 것이기 때문에 문제가 발생한 시점에 약간의 간격을 두어 몇 번 남기고 비교하는게 좋은 방법입니다.

Thread dump 를 남기자

■ Windows

Windows에서 thread dump를 남기려면 command console 에서 java 애플리케이션을 실행해야 합니다. 쓰레드 덤프를 남기려는 시점에 Ctrl-Break 를 console에서 입력합니다.

■ Unix/Linux

간단히 thread dump를 남기고 싶은 JVM process에 SIGQUIT 시그널을 보냅니다.

prompt> kill -SIGQUIT process_id
또는
prompt> kill -3 process_id

* java 프로세스 아이디를 찾으려면 ps axf | grep java 하면 되겠습니다.

Thread dump를 보자

Thread dump는 그냥 text 형태의 매우 긴 로그입니다. 따라서 여러개의 thread dump를 그냥 날로 보려면 좀 피곤합니다. thread dump를 쉽게 분석할 수 있는 몇 가지 도구가 있겠지만 그 중 Samurai 이용해 보면 좋습니다. (다른 건 써 본적이 없어서...)
다음 URL을 참조하세요.



 

댓글