Java强制线程以编程方式转储,类似于;jstack-F-l<;PID>&引用;

Java强制线程以编程方式转储,类似于;jstack-F-l<;PID>&引用;,java,unix,dump,programmatically-created,jstack,Java,Unix,Dump,Programmatically Created,Jstack,我试图以编程方式强制执行java线程转储,就像命令jstack-F-l那样 我的最佳尝试: 我从sun.jvm.hotspot.tools.JStack创建了一个子类,覆盖了run(),下面的代码类似于sun.jvm.hotspot.tools.JStack.run(),但在最后一行调用了start(printstream),而不是start(): 但这导致: java.lang.RuntimeException:无法从地址0xa5d12400推断线程的类型(预期类型为JavaThread、Co

我试图以编程方式强制执行java线程转储,就像命令
jstack-F-l
那样

我的最佳尝试: 我从
sun.jvm.hotspot.tools.JStack
创建了一个子类,覆盖了
run()
,下面的代码类似于
sun.jvm.hotspot.tools.JStack.run()
,但在最后一行调用了
start(printstream)
,而不是
start()

但这导致:

java.lang.RuntimeException:无法从地址0xa5d12400推断线程的类型(预期类型为JavaThread、CompilerThread、ServiceThread、JvmtiAgentThread或代理锁线程)
位于sun.jvm.hotspot.runtime.Threads.createJavaThreadWrapper(Threads.java:152)
位于sun.jvm.hotspot.runtime.Threads.first(Threads.java:140)
位于sun.jvm.hotspot.runtime.DeadlockDetector.createThreadTable(DeadlockDetector.java:149)
在sun.jvm.hotspot.runtime.DeadlockDetector.print上(DeadlockDetector.java:56)
在sun.jvm.hotspot.runtime.DeadlockDetector.print(DeadlockDetector.java:39)
位于sun.jvm.hotspot.tools.StackTrace.run(StackTrace.java:52)
在de.chili.savelogfiles.ChiliJStack.run(ChiliJStack.java:40)
位于sun.jvm.hotspot.tools.Tool.start(Tool.java:221)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:601)
位于de.chili.savelogfiles.JStackFRunnable.run(JStackFRunnable.java:81)
运行(Thread.java:722)
原因:sun.jvm.hotspot.types.ErrorTypeException:地址类型0xa5d12400不匹配(最近的符号是_ZTV10JavaThread)
位于sun.jvm.hotspot.runtime.InstanceConstructor.NewErrorTypeException(InstanceConstructor.java:62)
位于sun.jvm.hotspot.runtime.VirtualConstructor.InstanceWrapperFor(VirtualConstructor.java:80)
位于sun.jvm.hotspot.runtime.Threads.createJavaThreadWrapper(Threads.java:148)
... 还有13个
sun.jvm.hotspot.utilities.AssertionFailure:应为GenCollectedHeap、G1CollectedHeap或parallelCleaveHeap,但得到了sun.jvm.hotspot.gc_interface.CollectedHeap


我没有主意了……

我在这里发现了一些有用的东西

可能这会有帮助,不知道PID和线程ID是否相同

 final ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
 final ThreadInfo[] threadInfos = threadMXBean.getThreadInfo(<thread Ids>, 100);
final ThreadMXBean ThreadMXBean=ManagementFactory.getThreadMXBean();
final ThreadInfo[]threadInfos=threadMXBean.getThreadInfo(,100);

为什么不呢?我不知道这件事,也不知道是否允许这样做。如果存在安全管理器,则会使用RuntimePermission(“getStackTrace”)权限和RuntimePermission(“modifyThreadGroup”)权限调用安全管理器的checkPermission方法,以查看是否可以获取所有线程的堆栈跟踪
//reset stuff
VM.shutdown();

//clear observer list
Field f = VM.class.getDeclaredField("vmInitializedObservers");
f.setAccessible(true);
VM vmm = VM.getVM();
Object fo = f.get(vmm);
List folist = (List) fo;
folist.clear();

f = sun.jvm.hotspot.runtime.Threads.class.getDeclaredField("threadFactory");
f.setAccessible(true);
f.set(null, null);
f = sun.jvm.hotspot.runtime.Threads.class.getDeclaredField("threadListField");
f.setAccessible(true);
f.setAccessible(true);
f.set(null, null);
f = sun.jvm.hotspot.runtime.Threads.class.getDeclaredField("virtualConstructor");
f.setAccessible(true);
f.set(null, null);
f = sun.jvm.hotspot.runtime.Threads.class.getDeclaredField("access");
f.setAccessible(true);
f.set(null, null);

//reinit observer list
VM.registerVMInitializedObserver(new Observer() {
    public void update(Observable o, Object data) {
        try {
            Method initm = Threads.class.getDeclaredMethod("initialize", new Class<?>[] { TypeDataBase.class });
            initm.invoke(null, new Object[] { VM.getVM().getTypeDataBase() });
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
});
 final ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
 final ThreadInfo[] threadInfos = threadMXBean.getThreadInfo(<thread Ids>, 100);