- 기본 JDK에 포함되어 있는 jps, jmap, jhat 등을 이용해서 Heap Dump가 가능함 [ jps, jmap, jhat 사용법 및 예제 ]
- jps 를 이용해서 현재 실행되고 있는 JVM 프로세스들의 정보를 표시할 수 있음
- jps -lvm ⇒ JVM Flag 까지 같이 확인가능
- jmap을 이용해 메모리 덤프(.hprof file) 혹은 stdout으로 확인
- hprof file의 size와 실제 heap 사용량은 다름.
jmap -dump:format=b,file={dump file 이름} PID
- jhat을 이용해서 메모리 덤프를 분석 가능. 다른 툴들도 이용 가능(Eclipse Memory Analyzer — mat , )
TroubleShooting을 위해 셋업해야할 것들
- JVM flag에
-XX:+HeapDumpOnOutOfMemoryError
붙이기 : OOM error 발생 시 Java heap dump를 disk 에 저장
- Add
-verbose:gc
to the JVM command-line : 해당 로그로 GC가 얼마나 오래 걸리는지, free memory가 계속해서 줄어드는지를 확인할 수 있음
Eclipse Memory Analyzer
용어 정리
- Objects: 생성한 인스턴스 개수
- Shallow Heap : 객체 자체에 할당된 Heap Memory
- Retained Heap : Shallow Heap을 포함하여 객체에 할당된 모든 Heap Memory
- Unreachable objects : 다음 Garbage collection때 없어질 object 들을 말함. 보통은 memory leak을 결정하는데 중요한 요소는 아니지만, 때때로 얘네들을 조사하는것이 중요할 때가 있음. 예로, 애플리케이션이 Garbage collection을 하기 위해 많은 시간을 사용하고 있을 때, 보통의 현명한 방식보다 더 많은 수의 객체를 할당하고 삭제하고 있을 수 있음. 그 때, 해당 Garbage collection에서 버려질 객체들이 애플리케이션에서 임시로 할당하는 객체에 대한 증거를 제공해 줄 수 있음.
유용한 기능들
- Leak suspect : 가장 큰 용량을 차지하고 있는 객체들을 좀 더 세분화된 파이 도표로 보여줌
- Dominator tree : 현재 덤프 된 메모리 스냅 샷 중 가장 큰 용량을 차지하고 있는 객체 순으로 정렬하여 보여줌