gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:11:16 25 4
gpt4 key购买 nike

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

  • 远程计算机名称/IP 地址
  • 应用程序的 pid

最佳答案

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

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

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

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

List<ThreadInfo> threads = Arrays.asList(ManagementFactory.getThreadMXBean().dumpAllThreads(true, true));

toString()方法ThreadInfo确实提供了线程状态的可读版本,包括其堆栈跟踪。您必须对其进行一些自定义,使其可以通过 TDA 等工具进行解析。

选项 3 -正如您提到的,您无法调整正在运行的应用程序,另一种选择是使用 PsExec 执行远程进程。 。由于它是 Windows 服务器,这应该有所帮助。看看命令行选项 here .

PsExec.exe \\RemoteMachine -u Domain\username -p password C:\java\jdk\bin\jstack.exe 7300 > E:\Dump\threaddump.txt

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

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

关于java - 如何获取在远程 Windows 计算机上运行的 java 应用程序的所有线程的堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27264506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com