본문 바로가기

운영 중인 JVM은 jmap 대신 jcmd로 힙덤프와 스레드 덤프 뜨기

조회 0 · 댓글 0
강철지그강철지그작성자2026년 8월 20일

운영 중인 JVM에서 클래스 히스토그램, 힙덤프, 스레드 덤프를 떠야 할 때 예전엔 jmap을 썼지만, 지금 오라클 문서는 같은 작업을 jcmd 하나로 하도록 권장합니다. 실제로 GC.heap_dump는 jmap -dump와 동일한 동작이라고 문서에 적혀 있고 jcmd가 권장 도구입니다. 먼저 jcmd -l로 실행 중인 자바 프로세스의 PID를 확인한 뒤 필요한 커맨드를 붙입니다.

jcmd -l
jcmd <pid> GC.class_histogram      # 클래스별 인스턴스/바이트, 많은 순 정렬
jcmd <pid> Thread.print            # 스레드 덤프, -l=true면 j.u.c 락까지
jcmd <pid> GC.heap_dump /tmp/heap.hprof
jcmd <pid> VM.flags                # 적용된 JVM 플래그 확인

주의할 점 하나. GC.heap_dump는 -all 옵션을 주지 않으면 덤프 직전에 full GC를 한 번 수행합니다. 그래서 기본 덤프에는 도달 가능한 객체만 남습니다. 반대로 -all=true를 주면 도달 불가능한 객체까지 포함하는 대신 full GC는 생략합니다. 운영 피크에 무심코 돌리면 stop-the-world가 걸릴 수 있으니 부하 낮은 시점을 골라 실행합니다. 그리고 jcmd는 보통 대상 JVM과 같은 사용자로 실행해야 접속됩니다.

🔗 https://docs.oracle.com/en/java/javase/17/docs/specs/man/jcmd.html

🔗 https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html

로그인 후 답글을 남길 수 있습니다.