2016년 3월 28일 월요일

Java 프로세스 메모리 덤프 및 분석하기

jmap을 이용하여 지정한 Java 프로세스의 메모리를 덤프할 수 있다.

사용법: jmap [option] <pid>
서버 내 실행 중은 Java 프로세스의 pid (Process ID)를 지정. Core dump나 저멀리 있는 서버 내 프로세스의 메모리도 덤프할 수 있다. (jmap 설명서 참고)

[option]에는 다음과 같은 것들이 들어감.
  • -heap : Heap 요약 정보를 표시함.
  • -histo[:live] : 메모리를 할당 받은 java object를 히스토그램으로 표시함. 부가 옵션 live가 지정되면 살아있는 object만 counting 함.
  • -permstat : GC 설명할 때 나오는 Permanent 영역에 대한 통계 정보를 출력함.
  • -finalizerinfo : GC가 되기를 기다리고 있는 object의 정보를 출력.
  • -dump:[live,]format=b,file=<file> : hprof 바이너리 형태의 메모리 덤프 파일을 생성함. live를 넣으면 실제 활동(?) 중인 obejct에 대한 것만 덤프됨.
jmap -dump:format=b,file=a.dump 123 와 같이 실행하면 (123은 PID) 123에 해당하는 java process의 메모리 덤프가 a.dump 파일로 생성된다. 문제는 a.dump는 바이너리 파일이라 그냥 볼 수 없다. 하지만 Eclipse에서 제공하는 메모리 분석 툴로 이 파일을 읽으면 메모리 상태 및 다양한 분석을 할 수 있다. http://www.eclipse.org/mat/ 참고.

추가로 jmap 실행 시 다음과 같이
Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process
연결할 수 없다는 메시지가 나오면 root 권한으로 실행하면 된다.

저작자: Yes, 상업적 이용: No, 컨텐츠 변경: No

댓글 없음:

댓글 쓰기