JNA-based operating system and hardware information library for Java providing cross-platform access to system metrics
—
Detailed process and thread information including CPU usage, memory consumption, and process relationships with filtering and sorting capabilities.
The OperatingSystem interface provides comprehensive process management capabilities.
interface OperatingSystem {
// Process retrieval methods
List<OSProcess> getProcesses();
List<OSProcess> getProcesses(Predicate<OSProcess> filter, Comparator<OSProcess> sort, int limit);
List<OSProcess> getProcesses(Collection<Integer> pids);
OSProcess getProcess(int pid);
// Process hierarchy methods
List<OSProcess> getChildProcesses(int parentPid, Predicate<OSProcess> filter, Comparator<OSProcess> sort, int limit);
List<OSProcess> getDescendantProcesses(int parentPid, Predicate<OSProcess> filter, Comparator<OSProcess> sort, int limit);
// Current process methods
int getProcessId();
OSProcess getCurrentProcess();
int getProcessCount();
// Thread methods
int getThreadId();
OSThread getCurrentThread();
int getThreadCount();
}Comprehensive process information including resource usage, command line details, and state information.
interface OSProcess {
// Basic process information
String getName();
String getPath();
String getCommandLine();
String getCurrentWorkingDirectory();
// Process identity
int getProcessID();
int getParentProcessID();
String getUser();
String getUserID();
String getGroup();
String getGroupID();
// Process state and properties
State getState();
int getThreadCount();
int getPriority();
int getBitness();
long getAffinityMask();
// Memory usage
long getVirtualSize();
long getResidentSetSize();
int getMinorFaults();
int getMajorFaults();
// CPU usage
double getProcessCpuLoadCumulative();
double getProcessCpuLoadBetweenTicks(OSProcess priorSnapshot);
long getKernelTime();
long getUserTime();
long getContextSwitches();
// Timing information
long getUpTime();
long getStartTime();
// I/O statistics
long getBytesRead();
long getBytesWritten();
long getOpenFiles();
// Process details
String[] getArguments();
Map<String, String> getEnvironmentVariables();
List<OSThread> getThreadDetails();
enum State {
NEW, RUNNING, SLEEPING, WAITING, ZOMBIE, STOPPED, OTHER, INVALID
}
}Pre-built predicates for filtering process lists.
class ProcessFiltering {
static final Predicate<OSProcess> ALL_PROCESSES;
static final Predicate<OSProcess> VALID_PROCESS;
static final Predicate<OSProcess> NO_PARENT;
static final Predicate<OSProcess> BITNESS_64;
static final Predicate<OSProcess> BITNESS_32;
}ALL_PROCESSES - No filtering, includes all processesVALID_PROCESS - Excludes processes with INVALID stateNO_PARENT - Only processes that are their own parent (excludes child processes)BITNESS_64 - Only 64-bit processesBITNESS_32 - Only 32-bit processesPre-built comparators for sorting process lists.
class ProcessSorting {
static final Comparator<OSProcess> NO_SORTING;
static final Comparator<OSProcess> CPU_DESC;
static final Comparator<OSProcess> RSS_DESC;
static final Comparator<OSProcess> UPTIME_ASC;
static final Comparator<OSProcess> UPTIME_DESC;
static final Comparator<OSProcess> PID_ASC;
static final Comparator<OSProcess> PARENTPID_ASC;
static final Comparator<OSProcess> NAME_ASC;
}NO_SORTING - No sorting appliedCPU_DESC - Sort by decreasing cumulative CPU percentageRSS_DESC - Sort by decreasing Resident Set Size (memory usage)UPTIME_ASC - Sort by uptime, newest processes firstUPTIME_DESC - Sort by uptime, oldest processes firstPID_ASC - Sort by Process ID (ascending)PARENTPID_ASC - Sort by Parent Process ID (ascending)NAME_ASC - Sort by process name (case insensitive, ascending)Thread information within processes.
interface OSThread {
String getName();
int getThreadId();
OSProcess.State getState();
long getStartTime();
long getStartMemoryAddress();
long getContextSwitches();
long getKernelTime();
long getUserTime();
long getUpTime();
int getPriority();
}import oshi.SystemInfo;
import oshi.software.os.OperatingSystem;
import oshi.software.os.OSProcess;
SystemInfo si = new SystemInfo();
OperatingSystem os = si.getOperatingSystem();
// Get all processes (no filtering or sorting)
List<OSProcess> allProcesses = os.getProcesses();
System.out.println("Total processes: " + allProcesses.size());
for (OSProcess process : allProcesses) {
System.out.printf("PID: %d, Name: %s, State: %s%n",
process.getProcessID(),
process.getName(),
process.getState()
);
}import oshi.SystemInfo;
import oshi.software.os.OperatingSystem;
import oshi.software.os.OSProcess;
SystemInfo si = new SystemInfo();
OperatingSystem os = si.getOperatingSystem();
// Get top 10 processes by CPU usage
List<OSProcess> topCpuProcesses = os.getProcesses(
OperatingSystem.ProcessFiltering.VALID_PROCESS,
OperatingSystem.ProcessSorting.CPU_DESC,
10
);
System.out.println("Top CPU consuming processes:");
for (OSProcess process : topCpuProcesses) {
System.out.printf("%-20s PID: %5d CPU: %6.2f%% Memory: %8.1f MB%n",
process.getName(),
process.getProcessID(),
process.getProcessCpuLoadCumulative() * 100,
process.getResidentSetSize() / 1024.0 / 1024.0
);
}import oshi.SystemInfo;
import oshi.software.os.OperatingSystem;
import oshi.software.os.OSProcess;
SystemInfo si = new SystemInfo();
OperatingSystem os = si.getOperatingSystem();
// Get top 10 processes by memory usage
List<OSProcess> topMemoryProcesses = os.getProcesses(
OperatingSystem.ProcessFiltering.VALID_PROCESS,
OperatingSystem.ProcessSorting.RSS_DESC,
10
);
System.out.println("Top memory consuming processes:");
for (OSProcess process : topMemoryProcesses) {
System.out.printf("%-20s PID: %5d Memory: %8.1f MB Virtual: %8.1f MB%n",
process.getName(),
process.getProcessID(),
process.getResidentSetSize() / 1024.0 / 1024.0,
process.getVirtualSize() / 1024.0 / 1024.0
);
}import oshi.SystemInfo;
import oshi.software.os.OperatingSystem;
import oshi.software.os.OSProcess;
SystemInfo si = new SystemInfo();
OperatingSystem os = si.getOperatingSystem();
// Find a specific process and its children
OSProcess targetProcess = os.getProcess(1234); // Replace with actual PID
if (targetProcess != null) {
System.out.println("Process: " + targetProcess.getName());
// Get child processes
List<OSProcess> children = os.getChildProcesses(
targetProcess.getProcessID(),
OperatingSystem.ProcessFiltering.VALID_PROCESS,
OperatingSystem.ProcessSorting.NAME_ASC,
0
);
System.out.println("Child processes:");
for (OSProcess child : children) {
System.out.printf(" %s (PID: %d)%n", child.getName(), child.getProcessID());
}
// Get all descendants (children, grandchildren, etc.)
List<OSProcess> descendants = os.getDescendantProcesses(
targetProcess.getProcessID(),
OperatingSystem.ProcessFiltering.VALID_PROCESS,
OperatingSystem.ProcessSorting.NAME_ASC,
0
);
System.out.println("All descendants: " + descendants.size());
}import oshi.SystemInfo;
import oshi.software.os.OperatingSystem;
import oshi.software.os.OSProcess;
import oshi.software.os.OSThread;
SystemInfo si = new SystemInfo();
OperatingSystem os = si.getOperatingSystem();
OSProcess process = os.getProcess(1234); // Replace with actual PID
if (process != null) {
System.out.println("=== Process Details ===");
System.out.println("Name: " + process.getName());
System.out.println("Path: " + process.getPath());
System.out.println("Command Line: " + process.getCommandLine());
System.out.println("Working Directory: " + process.getCurrentWorkingDirectory());
System.out.println("User: " + process.getUser());
System.out.println("PID: " + process.getProcessID());
System.out.println("Parent PID: " + process.getParentProcessID());
System.out.println("State: " + process.getState());
System.out.println("Priority: " + process.getPriority());
System.out.println("Bitness: " + process.getBitness() + "-bit");
System.out.println("\n=== Memory Usage ===");
System.out.println("Virtual Size: " + process.getVirtualSize() / 1024 / 1024 + " MB");
System.out.println("Resident Set Size: " + process.getResidentSetSize() / 1024 / 1024 + " MB");
System.out.println("Page Faults (Minor): " + process.getMinorFaults());
System.out.println("Page Faults (Major): " + process.getMajorFaults());
System.out.println("\n=== CPU Usage ===");
System.out.println("CPU Load: " + (process.getProcessCpuLoadCumulative() * 100) + "%");
System.out.println("Kernel Time: " + process.getKernelTime() + " ms");
System.out.println("User Time: " + process.getUserTime() + " ms");
System.out.println("Context Switches: " + process.getContextSwitches());
System.out.println("\n=== Timing ===");
System.out.println("Start Time: " + new Date(process.getStartTime()));
System.out.println("Up Time: " + process.getUpTime() / 1000 + " seconds");
System.out.println("\n=== I/O ===");
System.out.println("Bytes Read: " + process.getBytesRead());
System.out.println("Bytes Written: " + process.getBytesWritten());
System.out.println("Open Files: " + process.getOpenFiles());
// Thread details
List<OSThread> threads = process.getThreadDetails();
System.out.println("\n=== Threads (" + threads.size() + ") ===");
for (OSThread thread : threads) {
System.out.printf(" Thread %d: %s (State: %s, Priority: %d)%n",
thread.getThreadId(),
thread.getName(),
thread.getState(),
thread.getPriority()
);
}
}import oshi.SystemInfo;
import oshi.software.os.OperatingSystem;
import oshi.software.os.OSProcess;
import java.util.function.Predicate;
SystemInfo si = new SystemInfo();
OperatingSystem os = si.getOperatingSystem();
// Custom filter: processes using more than 100MB of memory
Predicate<OSProcess> highMemoryFilter = process ->
process.getResidentSetSize() > 100 * 1024 * 1024;
// Custom filter: Java processes
Predicate<OSProcess> javaProcessFilter = process ->
process.getName().toLowerCase().contains("java") ||
process.getCommandLine().toLowerCase().contains("java");
// Combine filters: Java processes using high memory
Predicate<OSProcess> combinedFilter = highMemoryFilter.and(javaProcessFilter);
List<OSProcess> filteredProcesses = os.getProcesses(
combinedFilter,
OperatingSystem.ProcessSorting.RSS_DESC,
20
);
System.out.println("High-memory Java processes:");
for (OSProcess process : filteredProcesses) {
System.out.printf("%-30s PID: %5d Memory: %8.1f MB%n",
process.getName(),
process.getProcessID(),
process.getResidentSetSize() / 1024.0 / 1024.0
);
}import oshi.SystemInfo;
import oshi.software.os.OperatingSystem;
import oshi.software.os.OSProcess;
SystemInfo si = new SystemInfo();
OperatingSystem os = si.getOperatingSystem();
OSProcess process = os.getProcess(1234); // Replace with actual PID
if (process != null) {
System.out.println("Monitoring CPU usage for: " + process.getName());
// Take initial snapshot
OSProcess snapshot1 = process;
try {
Thread.sleep(1000); // Wait 1 second
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
// Take second snapshot
OSProcess snapshot2 = os.getProcess(process.getProcessID());
if (snapshot2 != null) {
double cpuLoad = snapshot2.getProcessCpuLoadBetweenTicks(snapshot1);
System.out.printf("CPU Load in last second: %.2f%%%n", cpuLoad * 100);
}
}Install with Tessl CLI
npx tessl i tessl/maven-com-github-oshi--oshi-core