Java 9에서는 Process API가 크게 개선되었습니다. 이제 실행 중인 프로세스의 PID(프로세스 ID)를 손쉽게 조회할 수 있고, 특정 프로세스의 자식(children) 또는 후손(descendants) 프로세스를 확인할 수 있습니다. 또한 시스템에서 실행 중인 모든 프로세스 목록을 가져오거나, 임의의 프로세스에 대한 상세 정보를 얻고, 프로세스 트리(process tree)를 탐색하는 데 유용한 새로운 클래스가 추가되었습니다.
이러한 메서드들이 반환하는 정보는 운영체제(OS)에서 실행 중인 프로세스들의 스냅샷(snapshot) 형태라는 점을 기억해 두면 좋습니다. 즉, 호출 시점의 프로세스 상태를 반영하며, 이후 프로세스가 종료되면 해당 정보에 더 이상 접근할 수 없을 수도 있습니다.
ProcessHandle을 활용한 PID 조회
Java 9부터 java.lang 패키지에 새롭게 도입된 ProcessHandle 인터페이스를 사용하면 현재 프로세스뿐만 아니라 다른 프로세스의 정보도 쉽게 다룰 수 있습니다. 아래 예제에서는 ProcessHandle.current()로 현재 실행 중인 프로세스의 핸들을 얻은 뒤, pid() 메서드를 호출하여 프로세스 ID를 출력합니다. 추가로 info() 메서드를 통해 실행 명령어와 CPU 사용 시간도 함께 확인할 수 있습니다.
예제 코드
public class ProcessHandleTest {
public static void main(String args[]) {
ProcessHandle processHandle = ProcessHandle.current();
System.out.println("PID of running Process: " + processHandle.pid());
System.out.println("Command: " + processHandle.info().command().orElse("N/A"));
System.out.println("CPU Duration: " + processHandle.info().totalCpuDuration().get().getSeconds() + " seconds");
}
}
실행 결과
PID of the running Process: 4248 Command: C:\Program Files\Java\jdk-9.0.4\bin\java.exe CPU Duration: 0 seconds
주요 메서드 정리
- pid(): 해당 프로세스의 고유한 PID를
long타입으로 반환합니다. - info(): 프로세스의 명령어(command), 시작 시간, CPU 사용 시간 등의 정보를 담은
ProcessHandle.Info객체를 반환합니다. - children(): 현재 프로세스의 직계 자식 프로세스 목록을 스트림으로 반환합니다.
- descendants(): 자식 프로세스를 포함한 모든 후손 프로세스를 스트림으로 반환합니다.
이처럼 Java 9의 개선된 Process API를 활용하면, 기존에는 외부 라이브러리나 플랫폼별 코드가 필요했던 프로세스 관리 작업을 표준 API만으로 깔끔하게 처리할 수 있습니다.