솔라리스 OS 와 리눅스 환경에서 자바 SE 6 에 대한 문제 해결(Troubleshooting) 가이드 팁(Quick Guide)
Written on 오후 7:47 by 강여사(J.Y.Kang)
본 문서는 "퀵 스타트 가이드"로 문제 해결(troubleshooting)을 위한 몇 가지 빠른 도움말을 제공합니다. 즉, 정보를 얻기 위해 작업을 수행하거나 하나 이상의 방법을 포함한 문제 해결에 도움이되는 몇 가지 일반적인 기능을 나열합니다.
이러한 요령으로 구성은 다음과 같습니다 : (해당 주제별)
- 행(Hung), 데드락(Deadlocked), 또는 루핑(Looping) 프로세스
- 사후 진단(Post-mortem Diagnostics), 메모리 누수(Leaks)
- 모니터링
- 원격 디버그 서버 상의 액션(Actions)
- 기타 기능
행(Hung), 데드락(Deadlocked), 또는 루핑(Looping) 프로세스
- 출력 쓰레드 모든 Java 쓰레드에 대한 스택 :
- Control-\
- kill-QUIT pid
- jstack pid (또는 jstack -F pid , 만약 jstack pid가 응답하지 않으면)
- Control-\
- 교착 상태를 감지 :
- 교착 상태 감지 요청: JConsole 툴, 쓰레드 탭(tab)
- 쓰레드 교착 상태에 정보 출력 : Control-\
- 각각의 쓰레드가 소유한 동시 잠금 목록 출력: -XX:+PrintConcurrentLocks 세트, 그 후 Control-\
- 프로세스에 대한 잠금 정보 출력 : jstack -l pid 명령
- 교착 상태 감지 요청: JConsole 툴, 쓰레드 탭(tab)
- 프로세스에 대한 힙 히스토그램(heap histrogram) 가져오기 :
- 자바 프로세스를 다음 옵션으로 시작 -XX:+PrintClassHistogram, 그 후 Control-\
- jmap -histo 명령 (만약 pid 응답이 없으면 -F 옵션 추가)
- 자바 프로세스를 다음 옵션으로 시작 -XX:+PrintClassHistogram, 그 후 Control-\
- 프로세스에 대한 자바 힙 덤프를 바이너리 형식의 파일에 덤프 뜨기:
- jmap –dump: format=b,file=filename pid (만약 pid 응답이 없으면 -F 옵션 추가)
- jmap –dump: format=b,file=filename pid (만약 pid 응답이 없으면 -F 옵션 추가)
- 프로세스를 위한 공유된 객체 매핑 출력
- jmap pid
- jmap pid
- 프로세스를 위한 힙 요약정보 출력
- Control-\
- jmap -heap pid
- Control-\
- 프로세스를 위한 종료자(finalization) 정보 출력
- jmap -finalizerinfo pid
- jmap -finalizerinfo pid
- 프로세스에 명령어 디버거 붙이기(attach)
- jdb -connect sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=pid jmap -histo 명령
- jdb -connect sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=pid jmap -histo 명령
사후 진단, (Post-mortem Diagnostics), 메모리 누수(Memory Leaks)
- 치명적인 오류 로그 파일을 검사합니다. 기본 파일 이름은 hs_err_pidpid.log 로 작업 디렉토리에 들어있습니다.
- 힙 덤프(heap dump) 생성 :
- HPROF 활성시켜 응용 프로그램 시작: java -agentlib:hprof=file=file,format=b application; 그후 Control-Break파일
- HPROF 활성시켜 응용 프로그램 시작: java -agentlib:hprof=heap=dump application
- JConsole 툴에서 MBeans 탭
- 다음 옵션으로 VM 시작 -XX:+HeapDumpOnOutOfMemoryError;; OutOfMemoryError 가 던져지면, VM은 힙 덤프(heap dump)를 자동 생성합니다.
- HPROF 활성시켜 응용 프로그램 시작: java -agentlib:hprof=file=file,format=b application; 그후 Control-Break파일
- 자바 힙 덤프 보기(Browse) :
- jhat heap-dump-file
- jhat heap-dump-file
- 프로세스에 대한 힙 히스토그램 가져오기:
- 다음 옵션으로 자바 프로세스 시작: -XX:+PrintClassHistogram, 그후 Control-Break
- jmap -histo pid (만약 pid 응답이 없으면 -F 옵션 추가)
- 다음 옵션으로 자바 프로세스 시작: -XX:+PrintClassHistogram, 그후 Control-Break
- 코어 파일로부터 힙 히스토그램 가져오기:
- jmap -histo corefile
- jmap -histo corefile
- 코어 파일로부터 공유된 객체 매핑 출력:
- jmap corefile
- jmap corefile
- 코어 파일로부터 힙 요약정보 출력:
- jmap -heap corefile
- jmap -heap corefile
- 코어 파일로부터 종료자(finalization) 정보 출력:
- jmap -finalizerinfo corefile
- jmap -finalizerinfo corefile
- 코어 파일로부터 자바 설정 정보 출력:
- jinfo corefile
- jinfo corefile
- 코어 파일로부터 쓰레드 추적 출력:
- jstack corefile
- jstack corefile
- 코어 파일로부터 잠금 정보 출력:
- jstack -l corefile
- jstack -l corefile
- 같은 머신 상에서 코어 파일에 명령어 디버거 붙이기(attach):
- jdb -connect sun.jvm.hotspot.jdi.SACoreAttachingConnector:javaExecutable=path,core=corefile
- jdb -connect sun.jvm.hotspot.jdi.SACoreAttachingConnector:javaExecutable=path,core=corefile
- 서로 다른 머신상에서 코어 파일에 명령어 디버거 붙이기(attach):
- 코어 파일을 가진 쪽: jsadebugd path corefile
- 디버거를 가진 쪽: jdb -connect sun.jvm.hotspot.jdi.SADebugServerAttachingConnector:debugServerName=machine
- 코어 파일을 가진 쪽: jsadebugd path corefile
- libumem 은 메모리 누수를 디버그하기 위해 사용될 수 있다.
모니터링 (jstat 윈도우 98이나 윈도우 ME에서 사용할 수 없습니다.)
참고 : jstat 명령에 대한 인수는 가상 머신 vmID 식별자입니다. jstat man 페이지를 참조하십시오
자세한 설명
- 클래스 로더에 통계 출력 :
- jstat -class vmID
- jstat -class vmID
- 컴파일러에 대한 통계 출력 :
- 컴파일러 동작 : jstat -compiler vmID
- 컴파일 메소드에 대한 통계 : jstat - printcompilation vmID
- 컴파일러 동작 : jstat -compiler vmID
- 가비지 컬렉션에 통계 출력 :
- 요약 통계 : jstat -gcutil vmID
- 오류 포함, 요약 통계 : jstat - gccause vmID
- GC의 힙 동작(behavior) : jstat -gc vmID
- 모든 generations 용량 : jstat -gccapacity vmID
- new generation 동작: jstat -gcnew vmID
- new generation 용량: jstat -gcnewcapacity vmID
- old 와 permanent generations 동작: jstat -gcold vmID
- old generations 용량 : jstat -gcoldcapacity vmID
- permanent generations 용량: jstat -gcpermcapacity vmID
- 요약 통계 : jstat -gcutil vmID
- finalization를 기다리는 개체 모니터링:
- JConsole 툴, VM 요약 탭
- jmap -finalizerinfo pid
- java.lang.management.MemoryMXBean 클래스 안에 있는 getObjectPendingFinalizationCount 메소드
- JConsole 툴, VM 요약 탭
- 메모리 모니터 :
- HPROF를 통해 힙 할당 프로필(profiles) : java -agentlib:hprof=heap=sites
- JConsole 툴, 메모리 탭
- Control – Break 는 generation 정보 출력
- HPROF를 통해 힙 할당 프로필(profiles) : java -agentlib:hprof=heap=sites
- CPU 사용률 모니터 :
- 쓰레드 스택 관련 : java -agentlib:hprof=cpu=samples application
- 메소드 관련 : java -agentlib:hprof=cpu=times application
- JConsole 툴, 개요 및 VM을 요약 탭
- 쓰레드 스택 관련 : java -agentlib:hprof=cpu=samples application
- 쓰레드 활동 모니터 :
- JConsole 툴, 쓰레드 탭
- JConsole 툴, 쓰레드 탭
- 클래스 액티비티 모니터 :
- JConsole 툴, 클래스 탭
- JConsole 툴, 클래스 탭
원격 디버그 서버 위의 액션(actions)
- 우선,디버그 데몬 jsadebugd 부르고, 그 후 명령 실행: jmap -dump:format=b,file=filename hostID
- 이진 포맷의 자바 힙을 파일에 덤프:
- 공유된 객체 매핑 출력: jmap hostID
- 힙 요약정보 출력 jmap -heap hostID
- 종료자 정보 출력: jmap -finalizerinfo hostID
- 잠금 정보 출력: jstack -l hostID
- 쓰레드 추적 출력: jstack hostID
- 자바 설정 정보 출력: jinfo hostID
- 이진 포맷의 자바 힙을 파일에 덤프:
기타 기능
- instrumented 자바 가상 머신 인터페이스 :
- instrumented VMs (Windows 98이나 Windows ME 불가) 생성 및 종료 모니터 : jstatd daemon
- instrumented VMs (Windows 98이나 Windows ME 불가) 목록 : jps
- 원격 모니터링 툴 및 로컬 VM 간 인터페이스 제공 (Windows 98 이나 Windows ME 불가) : jstatd daemon
- 가비지 컬렉션 요청 : JConsole 툴, 메모리 탭
- instrumented VMs (Windows 98이나 Windows ME 불가) 생성 및 종료 모니터 : jstatd daemon
- 프로세스의 특정 자바 VM 플래그(flags) 값 동적 설정, 해제, 또는 변경 :
- jinfo -flag flag pid
- jinfo -flag flag pid
- 가상 머신에 Java VM 플래그(flag) 전달하기 :
- jconsole -Jflag ...
- jhat -Jflag ...
- jmap -Jflag ...
- jconsole -Jflag ...
- 클래스 로더에 의한, 자바 힙의 영속 제너레이션 통계 출력
- jmap -permstat
- jmap -permstat
- 모니터 경합 보고 :
- java -agentlib:hprof=monitor=y application
- java -agentlib:hprof=monitor=y application
- 대화식(interactive) 모드 또는 일괄처리(batch) 모드로 스크립트 평가 또는 실행 :
- jrunscript
- jrunscript
- MBean 동적 인터페이스, JConsole 툴 탭을 통해 MBean :
- 트리 구조 보기.
- 속성 값 설정.
- 작업(operation) 호출.
- 알림(notification) 설정(subscribe)
- 트리 구조 보기.
- 대화식 명령 - 라인 디버거 실행 :
- 클래스에 대한 새 VM이 : jdb class
- 실행중인 VM에 디버거 첨부 : jdb –attach address
- 클래스에 대한 새 VM이 : jdb class
