2014-12-03 66 views

回答

1

选项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)); 

ThreadInfotoString()方法并提供包括它的堆栈跟踪线程状态的可读版本。你将不得不对其进行自定义,有点像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 
+0

谢谢@Andy的回答。我想要在一个文件中获得线程堆栈跟踪详细信息,就像** jstack **正在做的那样。所以我认为jvisualvm不能帮助我,因为只能手动保存它。我需要一个选项,如**命令>> file.txt ** – VISHNU 2014-12-03 06:35:14

+0

已添加更多信息 – 2014-12-03 06:47:19

+0

我无法对java应用程序(这是一个生产环境)进行任何调整。我在我的机器上运行一个监视应用程序,该监视应用程序在客户机中拥有足够的权限 – VISHNU 2014-12-03 07:15:14

0

由于 “没有第三方应用程序,只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”连接到以上公开的远程进程。连接后,只需在“线程”选项卡中查看您需要的内容。

+0

感谢@reniaL的答案。我需要在一个文件中获得堆栈跟踪。我需要稍后解析一些其他用途的细节。GUI不会满足我的目的。 – VISHNU 2014-12-03 06:29:15

相关问题