我尝试了几个选项
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 servertool
java-buildpack-memory-calculator-3.13.0_RELEASE
pack200
tnameserv
jjs
策略工具
unpack200
jvmkill-1.16.0_RELEASE
rmid
keytool
rmiregistry
问题是->如何获取java threaddump?
最佳答案
我相信最简单的选择是运行 cf logs
查看您的应用程序日志。然后在第二个终端中,cf ssh
到应用程序并运行 ps aux
并查找 Java 进程的进程 ID。然后运行kill -3 <pid>
。您的 Java 进程将捕获此信号并发出线程转储。它将转到 STDOUT,后者可以方便地转到应用程序的日志流,因此它应该显示在第一个终端中。
最糟糕的部分是cf logs
会在每行的开头注入(inject)一些额外的文本,这使得将线程转储加载到工具中变得困难。你通常可以用 cut
去掉它。或awk
,或者您可以重定向 cf logs
到一个文件,用文本编辑器打开并查找/替换前导文本。
此外,您还有其他几个选择:
如果您使用 Spring,请启用 Spring Boot Actuators。然后您可以使用
/actuator/threaddump
用于生成和下载线程转储的端点(请注意,此格式是 JSON,而不是标准格式)使用 APM 工具或分析器,例如 NewRelic、AppDynamics、Dynatrace 或 YourKit。这些都得到了 Java buildpack 的良好支持,并且大多数都可以正常工作。
使用 JMX。使用 Java buildpack 启用它非常简单,只需设置环境变量
JBP_CONFIG_JMX
至'{enabled: true}'
并重新编译您的应用程序。启用后,您可以使用cf ssh -N -T -L 5000:localhost:5000 <APP_NAME>
打开隧道。然后打开jvisualvm
,建立一个到“localhost:5000”的新“本地”JMX 连接并连接。单击“线程”选项卡,然后单击“线程转储”按钮。当它穿过隧道时,它可能会有点慢,但是给它几秒钟的时间来完成,你应该有一个线程转储。
在 Cloud Foundry 上不起作用的有 jstack
和jcmd
。在撰写本文时,Java 构建包安装了 JRE,这些工具不再随 OpenJDK JRE 一起提供,并且出于法律原因不能与其捆绑在一起。如果您愿意这样做,您可以 scp
将工具和所需的共享库从 JDK 上传到应用程序容器并运行它们,但这是一项繁重的工作,而且并不有趣。我对 cf java
不太熟悉插件,但我怀疑它尝试使用这些工具,这些工具曾经可用,但不再存在。
关于java - 如何在Cloud Foundry上获取java应用程序的threaddump?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59318654/