jcmd는 JVM 진단(diagnostic) 도구로, 로컬 머신에서 실행 중인 특정 JVM에 진단 명령을 전달할 수 있는 명령줄 유틸리티입니다. 이 도구는 Java 7 버전부터 JDK 설치에 기본 포함되어 있으며, 실행 파일은 "%java_home%\bin\jcmd.exe" 경로에 위치합니다.
환경 변수 "path"에 "%java_home%\bin" 디렉터리가 등록되어 있다면, 아래와 같이 "jcmd -h" 명령을 실행해 사용 가능한 모든 옵션 목록을 확인할 수 있습니다.
C:\Users\User>jcmd -h
Usage: jcmd
or: jcmd -l
or: jcmd -h
command must be a valid jcmd command for the selected jvm.
Use the command "help" to see which commands are available.
If the pid is 0, commands will be sent to all Java processes.
The main class argument will be used to match (either partially
or fully) the class used to start Java.
If no options are given, lists Java processes (same as -l).
PerfCounter.print display the counters exposed by this process
-f read and execute commands from the file
-l list JVM processes on the local machine
-h this help
jcmd가 중요한 이유
jcmd는 기존에 각각 따로 존재하던 진단 도구들(jstack, jmap, jinfo 등)의 핵심 기능을 하나로 통합한 통합 진단 인터페이스입니다. 힙 덤프 생성, 스레드 덤프 확인, GC 강제 실행, 시스템 속성 조회 등 대부분의 JVM 진단 작업을 단일 명령으로 수행할 수 있어, 운영 환경에서 성능 문제나 장애 원인을 빠르게 분석하는 데 매우 유용합니다.
예제 코드
아래는 메모리 상태를 출력하는 간단한 자바 프로그램입니다.
public class JCmdToolTest {
public static void main(String args[]) {
Runtime runtime = Runtime.getRuntime();
System.out.println("Free memory: " + runtime.freeMemory());
System.out.println("Total memory: " + runtime.totalMemory());
try {
Thread.sleep(5000);
} catch(InterruptedException e) {
}
}
}
실행 결과
Free memory: 65454560
Total memory: 67108864
프로그램이 실행되는 동안 "jcmd -l" 명령을 사용하면 로컬 머신에서 현재 구동 중인 모든 JVM 프로세스 목록을 확인할 수 있습니다. 출력 결과에서 PID(프로세스 ID) 또는 시작 클래스의 main 이름을 통해 대상 JVM을 식별한 후, 해당 프로세스에 다양한 진단 명령을 실행할 수 있습니다.
C:\Users\User>jcmd -l
6108 jdk.jcmd/sun.tools.jcmd.JCmd -l
이처럼 jcmd는 JVM 내부 상태를 실시간으로 관찰하고 문제를 진단할 수 있는 필수 도구이며, Java 9 이후에도 지속적으로 개선되어 현대 자바 애플리케이션 운영 및 디버깅의 핵심 요소로 자리 잡았습니다.