【问题标题】:Java Thread dump with JCMD使用 JCMD 的 Java 线程转储
【发布时间】:2019-01-10 18:41:33
【问题描述】:

我在 Ubuntu Linux 机器上使用 Java1.8。使用以下命令创建了一个线程转储:

jcmd 1670 Thread.print > Thread.jfr

将文件复制到本地MAC机器并双击在JMC中打开。它无法打开。怎么打开?

我尝试在安装了内存分析器的 STS 中打开相同的文件,它无法识别 jfr 文件。

1) 上述方法有什么问题?

2) 分析线程和堆转储的最佳工具是什么?

3) 堆或线程转储大小是否取决于 RAM 大小?我们有 64 GB ram 系统,分配 40 GB 给一个应用服务器。这有什么问题吗?

【问题讨论】:

  • 线程和堆转储是不同的东西。堆转储大小取决于 VM 的配置堆大小。线程转储大小取决于活动线程的数量。您可以使用 jdk 中的“jstack”触发到 STDOUT 的线程转储。只有当虚拟机因内存不足错误而停止时(通过虚拟机配置),我才会得到堆转储。我使用 JMAT(eclipse 项目)来分析堆转储。可以使用文本编辑器分析线程转储或上传到某些 Web 服务。如果垃圾收集器停止执行,那么 40GB 的 VM 堆大小可能会成为问题。

标签: java hprof jmc jcmd


【解决方案1】:

1) JFR 文件是由 JDK Flight Recorder 生成的包含大量信息的文件。它是二进制格式。您不能只重命名文本线程堆栈转储以使其成为飞行记录。

2) 取决于您要查找的内容。 Eclipse MAT 非常适合堆转储。如果你想做堆浪费分析,JOverflow 很好(见我的博客http://hirt.se/blog/?p=854)。 JMC 有一个线程分析插件,但我已经习惯了拥有比线程堆栈转储更丰富的信息。我建议仔细看看 JFR 和 JMC。

3) 堆转储将根据您的转储方式与 Java 堆上的实时数据成比例。线程堆栈转储将与线程数和跟踪深度成正比。

如果您想了解更多信息,请查看此博客: http://hirt.se/blog/?p=939

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 2011-06-20
    相关资源
    最近更新 更多