我试了几种方法
a. cf java thread-dump myapp -i0 (只有1个实例,所以为0)
响应为nothing。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 servertooljava-buildpack-memory-calculator-3.13.0_RELEASE
pack200 tnameservjjs
policytool unpack200 jvmkill-1.16.0\_RELEASE rmid关键点工具
rmiregistry 问题是->如何获得java线程转储?
发布于 2019-12-14 05:16:43
我相信最简单的选择是运行cf logs来查看你的应用程序日志。然后在第二个终端中,通过cf ssh连接到应用程序,运行ps aux并查找Java进程的进程id。然后运行kill -3 <pid>。您的Java进程将捕获此信号并发出线程转储。它将转到STDOUT,它可以方便地转到您的应用程序的日志流中,因此它应该显示在第一个终端中。
最糟糕的是,cf logs会在每一行的开头注入一些额外的文本,这使得很难将线程转储加载到工具中。通常可以使用cut或awk将其去掉,也可以将cf logs重定向到一个文件,然后用文本编辑器打开并查找/替换前导文本。
除此之外,你还有一些其他的选择:
/actuator/threaddump端点来生成和下载线程转储(注意,它的格式是JSON,而不是标准格式)JBP_CONFIG_JMX设置为'{enabled: true}'并重新部署您的应用程序即可。启用后,即可使用cf ssh -N -T -L 5000:localhost:5000 <APP_NAME>开通通道。然后打开jvisualvm,建立一个新的“本地”JMX连接到"localhost:5000“并连接。单击“线程”选项卡,然后单击“线程转储”按钮。它可能有点慢,因为它正在穿过隧道,但是给它几秒钟的时间来完成,你应该会有一个线程转储。不能在Cloud Foundry上工作的是jstack和jcmd。在撰写本文时,Java buildpack安装了一个OpenJDK,这些工具不再随Java一起提供,并且由于法律原因不能与其捆绑在一起。如果您愿意这样做,您可以将工具和所需的共享库从JDK scp到您的应用程序容器并运行它们,但这是大量的工作,并不有趣。我不是非常熟悉cf java插件,但我怀疑它试图使用这些工具,这些工具过去是可用的,但现在已经不存在了。
希望这能有所帮助!
发布于 2019-12-13 17:51:44
您应该能够使用kill -3 <PID>获取ThreadDumps,并在eclipse memory analyzer (MAT)等堆分析器中打开它,然后选择Thread Stacks
https://stackoverflow.com/questions/59318654
复制相似问题