如何从 Java VM 中列出主机操作系统的所有线程?

问题描述 投票:0回答:1

Java 标准库中是否有一些 API,可以在 JVM 中执行一些 Java 代码,列出运行 JVM 的主机操作系统的所有操作系统线程?

特别是,我不想列出执行我的Java代码的JVM的所有Java线程,而是列出主机操作系统的操作系统线程,其中运行JVM的主机进程只是操作系统线程之一。所以我想要一个操作系统线程列表,类似于 Linux top 命令通过运行 Java 代码显示的内容。

最好有一种方法,可以从 Java 内部查询运行 JVM 的操作系统线程 ID,在该 JVM 中执行 Java 代码以列出所有这些操作系统线程。我想为 Java 实现一些负载平衡,需要这些。

编辑:

与此同时,我发现了 hyperic sigar,它调用为 Windows 和 Linux 编写的库。不幸的是,它在我身上崩溃了,似乎已经停产了。

在 Windows 上,我会加载 Sigar Windows DLL。调用“System.loadLibrary”对我有用(崩溃直到我让它工作):

static {
        System.loadLibrary("sigar-amd64-winnt");
}

但是从 sigar.jar 运行代码会导致堆栈转储:

public static void main(String[] args) throws SigarException {
    var sigar = new Sigar();
    var list = sigar.getCpuList();
    for(var cpu : list) {
        System.out.println(cpu);
    }
}

但是执行“sigar.getCpuList()”会导致崩溃:

Java 框架:(J=编译的 Java 代码,j=解释的,Vv=VM 代码) j org.hyperic.sigar.Sigar.getCpuListNative()[Lorg/hyperic/sigar/Cpu;+0 j org.hyperic.sigar.Sigar.getCpuList()[Lorg/hyperic/sigar/Cpu;+1 j org.objectscape.Scratch.main([Ljava/lang/String;)V+9 v ~StubRoutines::call_stub

Windows dll 似乎不再适用于较新的 JDK。

认为有一种方法可以列出某些 JVM 正在其上运行的操作系统的所有操作系统线程,这些线程已添加到较新的 JDK 中。只是想不起来了,再上网搜一下就可以找到了……

java java-threads hyperic
1个回答
0
投票

ProcessBuilder
允许您从 Java 运行 shell 命令。请参阅此答案

外部函数取代了JNI作为在 JVM 之外调用本机代码的方式。

© www.soinside.com 2019 - 2024. All rights reserved.