망할놈의 DeadLock 잡아보자~ Java,Eclipse 후훗~ 그리고 Thread dump

2007. 3. 22. 10:13Java

오늘은 DeadLock에 대해서 알아볼려고 합니다.
솔직히 프로그래밍을 하면서 제일 쉬운것은 컴파일 오류죠 ~
바로 잡을 수 있습니다.

그다음이 런타임 오류들인데, 그나마 쉽게 고칠수 있습니다. 에러만 나오면요.
그러나 아무런 반응도, 에러도 없는 그냥 멈춰 버리는
데드 락 ㅡ.ㅡ; 무지 짜증나죠.

Deadlock
 ① 다중 프로그래밍 시스템(MPS)에서 하나 또는 그 이상의 프로세스가 수행할 수 없는 어떤 특정 이벤트를 기다리고 있는 상태. 망에서는 사용 가능한 버퍼가 없어 일단의 노드들이 패킷을 전송할 수 없는 상태이다.

 ② 2개 또는 그 이상으로 분리되어
실행 중인 프로세스들이 여러 자원에 대하여 경쟁을 하는 상황. P라는 프로세스자원 X, 그리고 자원 Y를 필요로 하며 수행 중 자원 요청도 이와 같은 순서로 한다고 가정하고, 동시에 프로세스 Q는 자원 Y, 그리고 자원 X를 필요로 하고 자원 요청 역시 같은 순서로 한다고 가정해 보자. 만약 프로세스 P가 자원 X를 획득했고, 동시에 프로세스 Q가 자원 Y를 획득했다면, 다음에 어떤 프로세스도 요구하는 자원을 획득할 수 없다. 왜냐하면 각각 이미 다른 프로세스에 할당되었기 때문이다.

 ③데이터
통신망에서, 송신기와 수신기 간에 전송할 정보는 있지만 송수신에 필요한 자원이 서로 맞물려 있어 송수신이 이루어질 수 없는 현상. 교착 상태에는 직접, 간접 및 재조립 교착 상태가 있다.

주로 동기화를 잘못 수행했을때 프로세스들이 엉켜 이더저도 수행되지 않는 걸 말하죠.
어떻게 풀까요. 가장 쉬운 방법은 역시 에러를 찾아 로그를 보는것입니다.

그럼 Java에서는 어떻게 할까요.
Thread dump를 뜨시면 됩니다.

Thread dump 를 뜨는 방법들


1. Ctrl+Break
Command 콘솔에서 프로그래밍을 실행시키고, 프로그래밍이 deadlock이 걸리면 Ctrl+break를 누르시면 떠집니다. 메모장이나 기타 파일에 내용을 붙여넣기(ctrl+v)하시면 되겠죠.

2. Java JDK 에 있는 Jconsole
    ( 이방법을 더 추천합니다. )
   알아서 실행된 자바프로그램 프로세스를 낚아채고 해당 프로세스를 선택하고 그 프로세스의 메모리, cpu,정보등 deadlock 정보까지 알아볼수 있습니다.
여기서는 2번째 방법을 알아볼까 합니다.
먼저 Eclipse든
실행할때 VM 옵션을 아래와 같이 줍니다.~

(아래는 Eclise>Run에서 해당 프로그램 옵션을 적는 곳입니다.)
사용자 삽입 이미지
-Dcom.sun.management.jmxremote

이제 프로그램을 실행시키고 나두십시오. 그리고 프로그램이 멈춰버렸다면
이제 JConsole로 해당 프로그램의 VM LOG를 살펴보면 됩니다.
JConsole은 다음 위치에 있습니다.

JDK 설치 디렉토리 > bin > jconsole.exe

사용자 삽입 이미지
구동하면 저렇게 분석할수 있는 프로세스가 나열 됩니다.
그럼 해당 프로세스를 선택하고 Connect를 누르면 이제 그 프로세스의  VM 로그를 분석할수 있지요~


사용자 삽입 이미지
위와같이 나올겁니다. 메모리 사용량, 현 상황 등등, Thread ㅋㅋ 다 볼수 있지요.
자아 저기 Detect Deadlock 버튼이 보이십니까? 만약 Deadlock이 걸린게 있다면 저 버튼을 누르면
해당 부분의 로그를 보여줍니다. 간단하죠.~ ^^

언제나 이런 툴을 보면 즐겁습니다.~ ㅎㅎㅎㅎ 그러나 이런 좋은툴도 개발자가 잘 사용하겠지요?
Deadlock이 걸렸을때 일일이 System.out.println으로 찍어보다가는 1년 금새 갑니다. 그러지 마시고
VM로그를 분석하세요.~ ^^



3. 기타.
    메모리 stack정보를 추출해주는 툴들이 많이 있습니다. 상용이긴 하지만.. ㅋㅋ
    < 그러나 웹스타트로 실행하는 것은 공짜입니다. ^^ >
    - 제품 사이트 :  http://tmitevski.users.mcs2.netarray.com/trace.do
    - 해당 제품 WebStart : http://tmitevski.users.mcs2.netarray.com/stacktrace/app/launch.jnlp

아래는 실행화면 입니다. 
사용자 삽입 이미지

메인메뉴>Process>Thread dump 를 선택하면 나오는 다이얼로그에서
 Thread dump를 체크하시고 확인을 누르시면 dump가 떠집니다.
사용자 삽입 이미지
쓸만한 툴입니다.~ 그러나 Jconsole을 쓰시기 바랍니다.~ ^^
by ncanis(조성준)