thread 덤프를 보고 문제를 찾아야 될 때가 되었다면..

난감한 문제 (서버의 응답이 없거나 ,느리거나. 특정 기능이 안되던가.. 등등) 와 만났을 것이다. 


1. 실행중인 java 버전이 1.4 이하라면.. (경험 해 보지 못하고 쓴 부분이 있습니다.)

linux : kill-3 [java process]

AIX 는 정말 잘된다. 다른 unix계열은.. 글세.. 해당 시그널이 가면 stdout에 출력이 되는 경우도 있고 

{java}/bin 밑에, 혹은 홈디렉토리에 생성되는 경우를 본적이 있다.

- windows :  

창모드 -> Ctrl + Break (해당 console에 출력됨.)

서비스 모드 -> SendSignal 을 이용하여 원하는 프로세스에 Signal(Ctrl+Break)을 보낼 수 있다.

(wrapper 로그에 남을듯..)

* java service wrapper의 설정. 아래 글을 보면 아래 설정을 하면 signal을 jvm에게 전달 할 수 있다고 한다.

java webservice의 현재 버전에 대한 내용이므로 참조만..

wrapper.request_thread_dump_on_failed_jvm_exit=TRUE

http://wrapper.tanukisoftware.com/doc/english/prop-request-thread-dump-on-failed-jvm-exit.html

http://wrapper.tanukisoftware.com/doc/english/qna-timers.html#dumps //특정시간마다 thread dump

http://wrapper.tanukisoftware.com/doc/english/prop-filter-x-n.html // 특정 이벤트시 dump 


2. java 버전이 1.5 이상이면. 

1. 위 방법과 동일  

2. threadDump.jsp 로 확인. (jsp를 업로드 하고 호출)

- 1.5에서 제공하는 메서드를 사용 함. 1.4 버전용은 안보임. 간편해서 좋음.

- http://www-01.ibm.com/support/docview.wss?uid=swg21439803

- http://greatkim91.tistory.com/167 : 한글로 잘 설명되어 있습니다.

2. java 1.5 버전 jconsole, java 1.6 버전 jvisualvm

아래 옵션을 JAVA 실행시 옵션에 추가. 

-Dcom.sun.management.jmxremote 

-Dcom.sun.management.jmxremote.port=2020 

-Dcom.sun.management.jmxremote.ssl=false 

-Dcom.sun.management.jmxremote.authenticate=false

- jconsole 실행후 local에 프로세스가 잡히면 그것을 선택하면 되고 아니면 remote로 port 정보를 추가로 입력하고 JVM을 확인 할수 있다. 기본적으로 thread dump 탭이 보이지 않았는데 플러그인을 설치하면 되는것 같다. 

- jvisualvm 은 visualvm으로 검색하여 다운도 받을 수도 있다. java6 이상이면 기본적으로 {JAVA_HOME}\bin 안에 있다. 

thread dump 파일을 얻을수 있다.

3. jstack 

widnows는 jdk 1.5의 특정버전 이나 jdk 1.6 버전 에서 쓸 수 있다.

- 사용법은 패스 > http://kwon37xi.egloos.com/2871508 

프로세스 아이디 (pid)를 알아내려면 

- UNIX, Linux, OSX : ps -el | grep java

- Windows : Ctrl+Shift+Esc > 보기 > 열 선택 > pid 체크


TOMCAT 팁. : 설치 버전 톰캣을 사용 중이라면, 트레이 아이콘을 우클릭하면  context Menu에 Thread Dump 라는 항목이 있다.

그밖에 키워드로는 javadump.exe 가 있는데 한번 해봐도 잘 안됨..






Posted by 마법수정화살
,