如何在 JRE 1.8.0_144 中获取 Java 线程转储

How to Obtain Java Thread Dump in JRE 1.8.0_144

我一直在尝试寻找方法从我的 Windows 服务器 运行 上的 Java 应用程序获取 Thread Dump,在 jre 1.8.0_144.

jcmd jstack jconsole 这样的监控工具在 binlib 文件夹 Java 环境目录。

我在网上遇到过几个声称可以执行相同任务但尚未找到可靠的应用程序。

感谢任何人有推荐或建议。 (不幸的是,更改 JRE 版本已被排除在外)

如果您 运行 tools.jar 可用,则有一种方法,即 运行 来自 JDK 而不是库存 JRE。但是,鉴于您没有可用的 jcmd、jstack、jconsole 工具,这不太可能。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Method;

// You need to add tools.jar to the classpath to get this
import com.sun.tools.attach.VirtualMachine;

public class Main {

    public static void main(String[] args) throws Exception {
        // Here you will need to use JNI or JNA to get the current process' PID
        // because the JRE version you are using doesn't have any other way.
        long pid = getCurrentPid(); // you need to create this method
        VirtualMachine vm = VirtualMachine.attach(""+pid);
            Method m = vm.getClass().getMethod("remoteDataDump", Object[].class);
            InputStream in = (InputStream) m.invoke(vm, new Object[] { new Object[0] } ); // awkward due to nested var-args
            try (BufferedReader buffer = new BufferedReader(new InputStreamReader(in))) {
                buffer.lines().forEach(System.out::println);
            }
    }
}