Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 9 Process API 핵심 라이브러리 주요 변경 사항 완벽 가이드

Java 9에서는 네이티브 호출을 통해 프로세스의 PID(프로세스 식별자)를 손쉽게 조회할 수 있게 되었으며, 이는 새롭게 도입된 ProcessHandle 인터페이스를 통해 구현됩니다. 기존에는 운영체제마다 다른 방식으로 프로세스 정보에 접근해야 했지만, Java 9부터는 표준 API로 통일되어 훨씬 편리해졌습니다.

ProcessHandle을 활용하면 다음과 같은 작업이 가능합니다.

  • 현재 실행 중인 Java 프로세스(JVM)의 정보 조회
  • 프로세스의 세부 정보를 담고 있는 내부 클래스 Info를 통한 상세 정보 확인
  • 시스템에서 현재 실행 중인 모든 프로세스의 스냅샷 반환

주요 메서드 살펴보기

ProcessHandle 인터페이스에서 자주 사용되는 핵심 메서드는 다음과 같습니다.

  • current(): 현재 실행 중인 프로세스의 ProcessHandle 객체를 반환합니다.
  • pid(): 해당 프로세스의 고유 식별자(PID)를 long 타입으로 반환합니다.
  • info(): 실행 파일 경로, 사용자 계정, 시작 시간 등 프로세스의 상세 정보를 담은 Info 객체를 반환합니다.
  • allProcesses(): 시스템에서 현재 실행 중인 모든 프로세스의 스트림을 반환합니다.

예제 코드

import java.lang.ProcessHandle.Info;

public class ProcessAPIChanges {
    public void detailedAPIInfo(ProcessHandle processHandle) {
        Info processInfo = processHandle.info();
        System.out.println("상세 프로세스 정보:");
        System.out.println("[실행 파일명] " + processInfo.command().get());
        System.out.println("[사용자 이름] " + processInfo.user().get());
        System.out.println("[시작 시간] " + processInfo.startInstant().get().toString());
    }
    public static void main(String args[]) {
        System.out.println("Process API 변경 사항 (핵심 라이브러리)");
        ProcessAPIChanges processAPIChanges = new ProcessAPIChanges();
        ProcessHandle processHandle = ProcessHandle.current();

        System.out.println("[현재 프로세스 ID] " + processHandle.pid());

        processAPIChanges.detailedAPIInfo(processHandle);
        ProcessHandle.allProcesses()
            .filter(ph -> ph.info().command().isPresent())
            .limit(4).forEach((process) -> processAPIChanges.detailedAPIInfo(process));
    }
}

실행 결과

Process API 변경 사항 (핵심 라이브러리)
[현재 프로세스 ID] 5724
상세 프로세스 정보:
[실행 파일명] C:\Program Files\Java\jdk-9.0.4\bin\java.exe
[사용자 이름] Tutorialspoint\User
[시작 시간] 2020-04-01T07:35:43.152Z
상세 프로세스 정보:
[실행 파일명] C:\WINDOWS\System32\taskhostex.exe
[사용자 이름] Tutorialspoint\User
[시작 시간] 2020-04-01T04:14:36.241Z
상세 프로세스 정보:
[실행 파일명] C:\Program Files\Synaptics\SynTP\SynTPEnh.exe
[사용자 이름] Tutorialspoint\User
[시작 시간] 2020-04-01T04:14:36.257Z
상세 프로세스 정보:
[실행 파일명] C:\WINDOWS\explorer.exe
[사용자 이름] Tutorialspoint\User
[시작 시간] 2020-04-01T04:14:36.335Z
상세 프로세스 정보:
[실행 파일명] C:\Program Files (x86)\Dell Wireless\Bluetooth Suite\BtvStack.exe
[사용자 이름] Tutorialspoint\User
[시작 시간] 2020-04-01T04:14:51.594Z

코드 해설

위 예제는 크게 세 단계로 동작합니다.

  1. 현재 프로세스 확인: ProcessHandle.current()를 호출해 현재 JVM 프로세스의 핸들을 얻고, pid() 메서드로 프로세스 ID를 출력합니다.
  2. 상세 정보 출력: info() 메서드가 반환하는 Info 객체에서 command()(실행 파일 경로), user()(사용자 계정), startInstant()(프로세스 시작 시각) 값을 조회합니다. 이 메서드들은 Optional을 반환하므로 get()으로 값을 꺼내 사용합니다.
  3. 전체 프로세스 스냅샷 조회: ProcessHandle.allProcesses()로 전체 프로세스 스트림을 가져온 뒤, 명령어 정보가 존재하는 프로세스만 필터링하고 limit(4)로 최대 4개만 선택하여 상세 정보를 출력합니다.

이처럼 Java 9의 개선된 Process API를 활용하면 외부 라이브러리나 플랫폼 종속적인 코드 없이도 순수 Java 코드만으로 프로세스를 관리하고 모니터링할 수 있습니다.