saygley
saygley

Reputation: 450

Java code - Best way to list java processes in localhost JVM (for Linux & Windows]

I'm writing a console app that will run in Linux and Windows systems. This app will mainly run on JRE 1.8 environments.

In my code, it needs to get a list of Java processes that run on the host running my application. I have read the posts about jps, which come as a part of JDK, but not JRE, and also it's a separate executable.

My question is, is there any java library that I can use, to list (and ideally also kill some of) the running Java processes? Preferably, I would not want to hassle of calling jps executable with sth like Runtime.exec().

Thanks in advance, for any suggestions.

Upvotes: 1

Views: 605

Answers (2)

saygley
saygley

Reputation: 450

I finally found the 3rd party library named Oshi, which apparently does not need JDK and is compatible with Java 1.8: https://github.com/oshi/oshi

For future reference, here is a sample method:

public static List<OSProcess> getOSProcesses() {
    SystemInfo si = new SystemInfo();
    OperatingSystem os = si.getOperatingSystem();
    return os.getProcesses();
}

Upvotes: 1

DuncG
DuncG

Reputation: 15156

Oops: I just spotted that you need solutions for JRE1.8, this will only help for JRE9+.

A simple way to scan processes within JRE is to use ProcessHandle.allProcesses(). This will read all processes and you can add filter on simple name match with "java" or "java.exe":

Path java = Path.of("bin", "java.exe");  // use "java" if not on Windows

ProcessHandle.allProcesses()
             .filter(ph -> ph.info().command().isPresent())
             .filter(ph -> Path.of(ph.info().command().get()).endsWith(java))
             .forEach(ph -> {
                 System.out.println("PID "+ph.pid()+" "+ph.info().command());
})

This approach won't spot Java VMs embedded in EXE - such as from jpackage - so is not as reliable as using JDK jps which does recognise jpackage EXEs and JDK tools like jshell.exe.

Upvotes: 1

Related Questions