CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-com-github-oshi--oshi-core

JNA-based operating system and hardware information library for Java providing cross-platform access to system metrics

Pending
Overview
Eval results
Files

process-management.mddocs/

Process Management

Detailed process and thread information including CPU usage, memory consumption, and process relationships with filtering and sorting capabilities.

Process Operations

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();
}

OSProcess Interface

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
    }
}

Process Filtering

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;
}

Filter Descriptions

  • ALL_PROCESSES - No filtering, includes all processes
  • VALID_PROCESS - Excludes processes with INVALID state
  • NO_PARENT - Only processes that are their own parent (excludes child processes)
  • BITNESS_64 - Only 64-bit processes
  • BITNESS_32 - Only 32-bit processes

Process Sorting

Pre-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;
}

Sort Descriptions

  • NO_SORTING - No sorting applied
  • CPU_DESC - Sort by decreasing cumulative CPU percentage
  • RSS_DESC - Sort by decreasing Resident Set Size (memory usage)
  • UPTIME_ASC - Sort by uptime, newest processes first
  • UPTIME_DESC - Sort by uptime, oldest processes first
  • PID_ASC - Sort by Process ID (ascending)
  • PARENTPID_ASC - Sort by Parent Process ID (ascending)
  • NAME_ASC - Sort by process name (case insensitive, ascending)

OSThread Interface

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();
}

Usage Examples

Get All Processes

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()
    );
}

Top CPU Consuming Processes

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
    );
}

Top Memory Consuming Processes

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
    );
}

Process Hierarchy

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());
}

Detailed Process Information

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()
        );
    }
}

Custom Process Filtering

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
    );
}

Process CPU Load Monitoring

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

docs

file-system.md

hardware.md

index.md

network.md

operating-system.md

process-management.md

system-info.md

tile.json