如何在Cloud foundry上获取java应用程序的线程转储?



>我尝试了几个选项

一个。cf java thread-dump myapp -i0(只有 1 个实例,所以 0(
回应不算什么。 我的应用显示日志 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

二. 我做了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 线程转储?

我相信最简单的选择是运行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构建包的良好支持,并且大多数都可以正常工作。

  • 使用 JMX。使用 Java 构建包启用非常简单,只需将 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 一起提供,并且出于法律原因不能与它捆绑在一起。如果您倾向于这样做,您可以将工具和所需的共享库从 JDKscp到您的应用程序容器并运行它们,但这需要大量工作且并不有趣。我对cf java插件不是很熟悉,但我怀疑它试图使用这些工具,这些工具曾经可用,现在不再存在。

您应该能够获取带有kill -3 <PID>的 ThreadDumps,并在堆分析器(如 eclipse 内存分析器 (MAT((中打开它并选择Thread Stacks

相关内容

  • 没有找到相关文章

最新更新