如何在JRE 1.8.0144中获得Java线程转储

如何在JRE 1.8.0144中获得Java线程转储,java,utility,thread-dump,window-server,Java,Utility,Thread Dump,Window Server,我一直在试图找到从运行在jre 1.8.0_144上的Windows服务器上的Java应用程序获取线程转储的方法 Java环境目录的bin或lib文件夹中提供了非监视实用程序,如jcmdjstackjconsole 我在网上遇到过几个声称可以执行相同任务的应用程序,但还没有找到一个可靠的 感谢任何人的推荐或建议。(不幸的是,更改JRE版本已被排除在选项之外)如果您使用可用的tools.jar运行,那么有一种方法可以从JDK而不是库存JRE运行。然而,考虑到您没有可用的jcmd、jstack和jc

我一直在试图找到从运行在jre 1.8.0_144上的Windows服务器上的Java应用程序获取线程转储的方法

Java环境目录的bin或lib文件夹中提供了非监视实用程序,如jcmdjstackjconsole

我在网上遇到过几个声称可以执行相同任务的应用程序,但还没有找到一个可靠的


感谢任何人的推荐或建议。(不幸的是,更改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);
            }
    }
}

非常感谢你。