【问题标题】:get a heap dump from a JRE only on Windows [duplicate]仅在 Windows 上从 JRE 获取堆转储 [重复]
【发布时间】:2016-03-29 08:32:20
【问题描述】:

我们的产品在我们客户的服务器上运行,在 Windows 上只有一个 JRE(无 JDK)。

我知道我可以通过一个标志在 OutOfMemoryError 上获得堆转储。

但是,有没有办法主动从 JRE JVM 进程中获取堆转储?

我正计划获取一些健康的堆转储,并将它们与在 OutOfMemoryError 上获得的堆转储进行比较。

最好我应该可以让客户下载这个工具/实用程序,然后在服务器上运行它来随意获取堆转储。

我尝试了jvisualvm,但是 jvisualvm 不会列出我们的产品 jVM。它只会列出当时运行的一些 JVM,而不是当时运行的所有 JVM。加上 jvisualvm 非常笨重。

P.S:是否有可以在 JVM 主机上执行以转储堆的 3rd 方实用程序?此外,客户此时无法升级 JRE。并且上一个问题的答案都没有被选为答案!

谢谢,

【问题讨论】:

  • 我看到了这个问题。鉴于该问题是 2 年前提出的,我正在寻找是否有实用程序等可以完成任务。

标签: java jvm heap-dump heap-profiling


【解决方案1】:
  1. 要从 JVM 中转储堆,请使用 com.sun.management.HotSpotDiagnosticMXBean

        HotSpotDiagnosticMXBean hs =
                ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class);
        hs.dumpHeap("/path/to/heapdump.bin", false);
    
  2. 要从外部转储另一个进程的堆,请使用HotSpot Dynamic Attach mechanism
    我为此编写了一个小实用程序,请参阅https://github.com/apangin/jattach

    使用make 构建程序,然后运行

    jattach <PID> dumpheap /path/to/heapdump.bin
    

【讨论】:

  • jattach 是否转储 .hprof 文件?
  • 我尝试在 cygwin/windows 上构建,但无法构建。我正在 github 中为同样的问题创建问题。
  • @anjanb 是的,它转储 .hprof,就像 jmap 一样。我已经为 Windows 添加了 jattach 实现。
  • 谢谢。我会对其进行测试,并让您知道它是否适合我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 2012-06-22
  • 1970-01-01
  • 2018-09-04
  • 2021-01-15
  • 1970-01-01
相关资源
最近更新 更多