0

我尝试了几个选项

一个。cf java thread-dump myapp -i0(只有 1 个实例,所以 0)
响应什么都不是。myapp 的日志显示 2019-12-13T14:52:41.15+0800 [SSH/0] OUT 远程访问成功 10.xxx:35764 2019-12-13T14:52:41.84+0800 [SSH/0] OUT 远程访问结束对于 10.xxx:35764

湾。我做了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 servertool
java-buildpack-memory-calculator-3.13.0_RELEASE
pack200
tnameserv
jjs
policytool
unpack200 jvmkill-1.16.0_RELEASE
rmid
keytool
rmiregistry

问题是-> 如何获取 java threaddump?

4

2 回答 2

1

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

关于这一点的糟糕之处在于,cf logs它将在每一行的开头注入一些额外的文本,这使得将线程转储加载到工具中变得很困难。您通常可以使用 or 将其删除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 连接并连接。单击“线程”选项卡,然后单击“线程转储”按钮。它在穿过隧道时可能会有点慢,但是给它几秒钟的时间来完成,你应该有一个线程转储。

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

希望有帮助!

于 2019-12-13T21:16:42.857 回答
0

您应该能够使用 ThreadDumps并在Eclipse 内存分析器 (MAT)kill -3 <PID>等堆分析器中打开它并选择Thread Stacks

于 2019-12-13T09:51:43.820 回答