>我尝试了几个选项
一个。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
会在每行的开头注入一些额外的文本,这使得很难将线程转储加载到工具中。您通常可以使用cut
或awk
将其剥离,或者您可以将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上不起作用的是jstack
和jcmd
。在撰写本文时,Java buildpack 会安装 JRE,这些工具不再随 OpenJDK JRE 一起提供,并且出于法律原因不能与它捆绑在一起。如果您倾向于这样做,您可以将工具和所需的共享库从 JDKscp
到您的应用程序容器并运行它们,但这需要大量工作且并不有趣。我对cf java
插件不是很熟悉,但我怀疑它试图使用这些工具,这些工具曾经可用,现在不再存在。
您应该能够获取带有kill -3 <PID>
的 ThreadDumps,并在堆分析器(如 eclipse 内存分析器 (MAT((中打开它并选择Thread Stacks