Java 9 introduced the ProcessHandle
API, which allows us to interact with and retrieve information about native processes. Here’s how we can use ProcessHandle
to get information about operating system processes:
We can list all the processes currently running on the system and print their details:
package org.kodejava.example.lang;
import java.time.Duration;
import java.time.Instant;
public class ProcessHandleExample {
public static void main(String[] params) {
ProcessHandle.allProcesses()
.forEach(process -> {
long pid = process.pid();
ProcessHandle.Info info = process.info();
String cmd = info.command().orElse("");
String[] args = info.arguments().orElse(new String[0]);
Instant startTime = info.startInstant().orElse(null);
Duration cpuUsage = info.totalCpuDuration().orElse(Duration.ZERO);
System.out.println("PID = " + pid);
System.out.println("Command = " + cmd);
System.out.println("Args = " + String.join(" ", args));
System.out.println("Start Time = " + startTime);
System.out.println("CPU Usage = " + cpuUsage);
System.out.println("------------");
});
}
}
If we want to get information about a specific process, we can use their process ID (PID):
package org.kodejava.example.lang;
import java.time.Duration;
import java.time.Instant;
import java.util.Optional;
public class SpecificProcessInfo {
public static void main(String[] params) {
// Replace with the PID of the process you want to query
long pid = 33656;
// Get the ProcessHandle of the specific process
Optional<ProcessHandle> processHandle = ProcessHandle.of(pid);
if (processHandle.isPresent()) {
ProcessHandle process = processHandle.get();
pid = process.pid();
ProcessHandle.Info info = process.info();
String cmd = info.command().orElse("");
String[] args = info.arguments().orElse(new String[0]);
Instant startTime = info.startInstant().orElse(null);
Duration cpuUsage = info.totalCpuDuration().orElse(Duration.ZERO);
System.out.println("PID = " + pid);
System.out.println("Command = " + cmd);
System.out.println("Args = " + String.join(" ", args));
System.out.println("Start Time = " + startTime);
System.out.println("CPU Usage = " + cpuUsage);
System.out.println("------------");
} else {
System.out.println("No process found with PID: " + pid);
}
}
}
Output:
PID = 33656
Command = C:\Users\wayan\AppData\Local\Programs\IntelliJ IDEA Ultimate\bin\idea64.exe
Args =
Start Time = 2024-07-22T03:14:07.825Z
CPU Usage = PT46M27.484375S
------------
Explanation
ProcessHandle.allProcesses()
: returns a stream of all processes currently running on the system.ProcessHandle.of(pid)
: returns anOptional<ProcessHandle>
for the process with the given PID.ProcessHandle.Info
: contains information about a process, such as its command, arguments, start time, and CPU usage.info.command()
: returns anOptional<String>
with the command used to start the process.info.arguments()
: returns anOptional<String[]>
with the arguments passed to the process.info.startInstant()
: returns anOptional<Instant>
with the start time of the process.info.totalCpuDuration()
: returns anOptional<Duration>
with the total CPU time used by the process.
Using the ProcessHandle
API in Java 9 and later makes it straightforward to get detailed information about operating system processes.