我有一个远程Windows机器运行一些Java CMD应用程序。我需要从本地机器的命令提示符处获取应用程序线程的堆栈跟踪。 Iam不应该使用任何第三方应用程序。远程计算机和本地计算机都安装了JDK 7。什么所有的细节我已经是如何获得远程Windows机器上运行的Java应用程序的所有线程的堆栈跟踪
- 远程计算机的名称/ IP地址
- 应用
我有一个远程Windows机器运行一些Java CMD应用程序。我需要从本地机器的命令提示符处获取应用程序线程的堆栈跟踪。 Iam不应该使用任何第三方应用程序。远程计算机和本地计算机都安装了JDK 7。什么所有的细节我已经是如何获得远程Windows机器上运行的Java应用程序的所有线程的堆栈跟踪
选项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(本机)不同的具有
List<ThreadInfo> threads = Arrays.asList(ManagementFactory.getThreadMXBean().dumpAllThreads(true, true));
的ThreadInfo
的toString()
方法并提供包括它的堆栈跟踪线程状态的可读版本。你将不得不对其进行自定义,有点像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
由于 “没有第三方应用程序,只JDK”,那么你应该尝试的PID JConsole的,这是作为JDK的一部分,显示应该满足您需要的各种Java应用程序的信息。
在这里看到:Exposing a Resource for Remote Management By JConsole
一般来说,你应该做的:
首先,暴露的远程管理,例如应用程序属性启动远程机器上的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”连接到以上公开的远程进程。连接后,只需在“线程”选项卡中查看您需要的内容。
感谢@reniaL的答案。我需要在一个文件中获得堆栈跟踪。我需要稍后解析一些其他用途的细节。GUI不会满足我的目的。 – VISHNU 2014-12-03 06:29:15
谢谢@Andy的回答。我想要在一个文件中获得线程堆栈跟踪详细信息,就像** jstack **正在做的那样。所以我认为jvisualvm不能帮助我,因为只能手动保存它。我需要一个选项,如**命令>> file.txt ** – VISHNU 2014-12-03 06:35:14
已添加更多信息 – 2014-12-03 06:47:19
我无法对java应用程序(这是一个生产环境)进行任何调整。我在我的机器上运行一个监视应用程序,该监视应用程序在客户机中拥有足够的权限 – VISHNU 2014-12-03 07:15:14