首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Cloud foundry上获取java应用程序的线程转储?

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

Stack Overflow用户
提问于 2019-12-13 16:23:49
回答 2查看 2.2K关注 0票数 0

我试了几种方法

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

代码语言:javascript
复制
                           orbd                                             servertool

java-buildpack-memory-calculator-3.13.0_RELEASE

代码语言:javascript
复制
pack200 
代码语言:javascript
复制
                                        tnameserv

jjs

代码语言:javascript
复制
                                        policytool 
代码语言:javascript
复制
                                     unpack200 jvmkill-1.16.0\_RELEASE 
代码语言:javascript
复制
                         rmid

关键点工具

代码语言:javascript
复制
                                rmiregistry   

问题是->如何获得java线程转储?

EN

回答 2

Stack Overflow用户

发布于 2019-12-14 05:16:43

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

最糟糕的是,cf logs会在每一行的开头注入一些额外的文本,这使得很难将线程转储加载到工具中。通常可以使用cutawk将其去掉,也可以将cf logs重定向到一个文件,然后用文本编辑器打开并查找/替换前导文本。

除此之外,你还有一些其他的选择:

  • 如果您使用的是Spring,请启用Spring Boot执行器。然后,您可以使用/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,建立一个新的“本地”JMX连接到"localhost:5000“并连接。单击“线程”选项卡,然后单击“线程转储”按钮。它可能有点慢,因为它正在穿过隧道,但是给它几秒钟的时间来完成,你应该会有一个线程转储。

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

希望这能有所帮助!

票数 1
EN

Stack Overflow用户

发布于 2019-12-13 17:51:44

您应该能够使用kill -3 <PID>获取ThreadDumps,并在eclipse memory analyzer (MAT)等堆分析器中打开它,然后选择Thread Stacks

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59318654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档