Java 如何在Azure应用程序服务上进行线程转储?

Java 如何在Azure应用程序服务上进行线程转储?,java,azure,tomcat,tomcat8,Java,Azure,Tomcat,Tomcat8,我有一个运行Tomcat8.5的Azure应用程序服务,似乎不知道如何进行线程转储。控制台和调试控制台中都无法识别jstack。在Azure应用程序服务上,所有流行的Java版本都已安装在路径D:\Program Files(x86)\Java上。以1.8.0u73版本为例,请参见下图 您可以命令set PATH=D:\Program Files(x86)\Java\jdk1.8.0\u 73\bin;%PATH%通过Kudu控制台工具将Java工具临时添加到环境中。然后,当前Kudu会话中提

我有一个运行Tomcat8.5的Azure应用程序服务,似乎不知道如何进行线程转储。控制台和调试控制台中都无法识别jstack。

在Azure应用程序服务上,所有流行的Java版本都已安装在路径
D:\Program Files(x86)\Java
上。以1.8.0u73版本为例,请参见下图


您可以命令
set PATH=D:\Program Files(x86)\Java\jdk1.8.0\u 73\bin;%PATH%
通过Kudu控制台工具将Java工具临时添加到环境中。然后,当前Kudu会话中提供了
jstack
工具。

受前面答案的启发,我创建了以下bat脚本(我想可能是powershell)来完成此任务:

powershell -Command "get-process java |select -expand id" > pid.txt
set /p id= < pid.txt
"%JAVA_HOME%\bin\jstack" -F %id% > out.txt
powershell-命令“获取进程java |选择-扩展id”>pid.txt
set/p id=out.txt

它使用您在应用程序(java_HOME)中使用的java版本,不需要您的任何输入。这很简单,而且很管用。例如,只需在wwwroot中创建一个bat文件,并随时运行它。

可能是Kudu控制台?根据您的回答,我在process explorer选项卡中使用java进程中的pid尝试了jstack,但我得到了“线程中的异常”main“java.io.IOException:Premature EOF”。这可能是我的特定应用程序的一个问题,因此您能否验证您是否可以通过这种方式进行线程转储?@DaveyChu您的异常似乎是由
jstack
生成大量内容引起的。请尝试
jstack-F PID>D:\home\site\out.txt
将内容输出到文本文件。