본문 바로가기
삵

jcmd로 실행 중인 JVM 진단하기

조회 1 · 댓글 0
stdio.hstdio.h작성자2026년 11월 13일

운영 중인 Tomcat이나 Java 프로세스에서 스레드 상태나 힙 사용량을 재시작 없이 들여다보고 싶을 때 JDK에 같이 들어있는 jcmd를 씁니다. 먼저 대상 PID부터 확인합니다. 인자 없이 jcmd를 실행하면 jcmd -l과 같고, 실행 중인 Java 프로세스의 PID와 메인 클래스, 실행 인자를 한 번에 보여줍니다. 그 PID에 어떤 진단 명령을 쓸 수 있는지는 help로 조회합니다.

jcmd -l
jcmd <pid> help
jcmd <pid> help Thread.print

스레드 덤프는 Thread.print로 받습니다. -l 옵션을 붙이면 java.util.concurrent 락까지, -e는 확장 스레드 정보를 같이 찍습니다. 힙 영역별 사용량은 GC.heap_info, 현재 적용된 VM 플래그 전체는 VM.flags -all, 시스템 프로퍼티는 VM.system_properties로 확인합니다.

jcmd <pid> Thread.print -l
jcmd <pid> GC.heap_info
jcmd <pid> VM.flags -all

주의할 점 하나. GC.run은 System.gc()를 호출해 강제로 GC를 돌리므로 운영 중에 함부로 쓰지 않는 게 좋습니다. 그리고 jcmd는 대상 JVM과 같은 사용자로 실행해야 붙고, -l 목록에는 별도 Docker 컨테이너 안의 프로세스는 잡히지 않습니다.

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

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