如何在Cloud Foundry上获取Java应用程序的threaddump?

我尝试了几种选择

a。 cf java thread-dump myapp -i0(那里只有1个实例,所以为0)
 反应不算什么。 myapp的日志显示 2019-12-13T14:52:41.15 + 0800 [SSH / 0] OUT成功通过10.x.x.x:35764进行远程访问   2019-12-13T14:52:41.84 + 0800 [SSH / 0] OUT远程访问结束于10.x.x.x:35764

b。我做了cf ssh myapp

/home/vcap/app/.java-buildpack/open_jdk_jre/bin/没有jstack并且jmap命令也不起作用 /home/vcap/app/.java-buildpack/open_jdk_jre/bin/具有以下组件

java
orbd服务器工具
java-buildpack-memory-calculator-3.13.0_RELEASE
pack200
tnameserv
jjs
policytool
unpack200 jvmkill-1.16.0_RELEASE
rmid
键盘工具
rmiregistry

问题是->如何获取Java线程转储?

flh12004029 回答:如何在Cloud Foundry上获取Java应用程序的threaddump?

我认为最简单的选择是运行cf logs来查看您的应用日志。然后在第二个终端中,cf ssh到应用程序并运行ps aux,并查找Java进程的进程ID。然后运行kill -3 <pid>。您的Java进程将捕获此信号并发出线程转储。它将进入STDOUT,这将方便地进入您应用的日志流,因此应显示在第一个终端中。

与此有关的最糟糕的部分是,cf logs将在每行的开头插入一些其他文本,这使得很难将线程转储加载到工具中。通常,您可以使用cutawk将其删除,也可以将cf logs重定向到文件,使用文本编辑器打开并查找/替换前导文本。

除了您还有其他一些选择:

  • 如果您使用的是Spring,请启用Spring Boot Actuators。然后,您可以使用/actuator/threaddump端点生成并下载线程转储(请注意,此格式为JSON,而不是标准格式)

  • 使用APM工具或分析器,例如NewRelic,AppDynamics,Dynatrace或YourKit。 Java buildpack对它们提供了很好的支持,并且大多数都可以使用。

  • 使用JMX。使用Java buildpack启用它很容易,只需将env变量JBP_CONFIG_JMX设置为'{enabled: true}'并重新启动应用程序即可。启用后,您可以使用cf ssh -N -T -L 5000:localhost:5000 <APP_NAME>打开隧道。然后打开jvisualvm,建立与“ localhost:5000”的新“本地” JMX连接并进行连接。单击“线程”选项卡,然后单击“线程转储”按钮。在隧道中穿行可能会有点慢,但是要花几秒钟才能完成,您应该进行线程转储。

jstackjcmd在Cloud Foundry上不起作用。在撰写本文时,Java buildpack安装了JRE,并且这些工具不再随OpenJDK JRE一起提供,并且出于法律原因不能与之捆绑在一起。如果您愿意,可以scp从JDK到您的应用容器cf java进行工具和所需的共享库并运行它们,但这是很多工作,而且并不有趣。我对_servicetype插件不是很熟悉,但是我怀疑它会尝试使用这些工具,这些工具以前可用,现在已经不存在了。

希望有帮助!

,

您应该能够使用kill -3 <PID>获取ThreadDump,并在堆分析器(例如eclipse memory analyzer (MAT))中打开它,然后选择Thread Stacks

本文链接:https://www.f2er.com/2928659.html

大家都在问