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 가 있는데 한번 해봐도 잘 안됨..