Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取在远程windows计算机上运行的java应用程序的所有线程的堆栈跟踪_Java_Windows_Command Line_Stack Trace - Fatal编程技术网

如何获取在远程windows计算机上运行的java应用程序的所有线程的堆栈跟踪

如何获取在远程windows计算机上运行的java应用程序的所有线程的堆栈跟踪,java,windows,command-line,stack-trace,Java,Windows,Command Line,Stack Trace,我有一台远程windows机器,运行一些java cmd应用程序。我需要从本地计算机的命令提示符中获取应用程序线程的堆栈跟踪。我不应该使用任何第三方应用程序。远程和本地计算机都安装了JDK 7。我所有的细节都是 远程计算机名称/IP地址 应用程序的pid 既然“没有第三方应用程序,只有jdk”,那么您应该尝试JConsole,它是jdk的一部分,显示java应用程序的各种信息,这些信息应该满足您的需要 请看这里: 一般来说,您应该做的是: 首先,在远程机器上启动java应用程序,并使用公开应用

我有一台远程windows机器,运行一些java cmd应用程序。我需要从本地计算机的命令提示符中获取应用程序线程的堆栈跟踪。我不应该使用任何第三方应用程序。远程和本地计算机都安装了JDK 7。我所有的细节都是

  • 远程计算机名称/IP地址
  • 应用程序的pid
既然“没有第三方应用程序,只有jdk”,那么您应该尝试JConsole,它是jdk的一部分,显示java应用程序的各种信息,这些信息应该满足您的需要

请看这里:

一般来说,您应该做的是:

首先,在远程机器上启动java应用程序,并使用公开应用程序进行远程管理的属性,例如

java -Dcom.sun.management.jmxremote.port = 9999  \
     -Dcom.sun.management.jmxremote.authenticate = false \
     -Dcom.sun.management.jmxremote.ssl = false \
     YOUR_APP

然后,在本地计算机上启动jconsole,以“HOSTNAME:PORT”格式连接到上面公开的远程进程。连接后,只需在“线程”选项卡中查看所需内容即可。

选项1-您可以使用以下jmx选项启动应用程序,并通过连接到远程计算机上运行的jvm实例。JVisualVM提供了一种方法

线程转储可以保存到文本文件中(手动),以供以后分析

选项2-如果您想自动化获取线程转储的过程,那么在java应用程序本身中添加该逻辑会更简单。JMX提供了一种获取线程转储的方法,尽管它的格式不同于jstack(本机)的格式

应在本地计算机上创建threaddump.txt文件。然后可以在批处理文件中执行此操作,以自动定期执行线程转储,如下所示

:loop
&:: Add your remote psexec command here.
ping localhost -n 11 > nul
goto loop

谢谢@reniaL的回答。我需要在文件中获取堆栈跟踪。我需要在以后解析细节以用于其他用途。GUI不符合我的目的。谢谢@Andy的回答。我想在文件中获取线程堆栈跟踪细节,就像jstack所做的那样。所以我认为jvisualvm对我没有帮助,因为它只能手动保存。我需要一个类似**命令>>文件.txt**的选项,我无法在java应用程序中进行任何调整(这是一个生产环境)。我正在从我的计算机上运行一个监控应用程序,该应用程序在客户端计算机上具有足够的权限。
List<ThreadInfo> threads = Arrays.asList(ManagementFactory.getThreadMXBean().dumpAllThreads(true, true));
PsExec.exe \\RemoteMachine -u Domain\username -p password C:\java\jdk\bin\jstack.exe 7300 > E:\Dump\threaddump.txt
:loop
&:: Add your remote psexec command here.
ping localhost -n 11 > nul
goto loop