Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 仅在Windows上从JRE获取堆转储_Java_Jvm_Heap Dump_Heap Profiling - Fatal编程技术网

Java 仅在Windows上从JRE获取堆转储

Java 仅在Windows上从JRE获取堆转储,java,jvm,heap-dump,heap-profiling,Java,Jvm,Heap Dump,Heap Profiling,我们的产品在客户的服务器上运行,在Windows上只有一个JRE(没有JDK) 我知道我可以通过标志在OutOfMemoryError上获得堆转储 但是,有没有办法主动从JRE JVM进程获取堆转储 我计划得到一些健康的堆转储,并将它们与OutOfMemoryError上获得的堆转储进行比较 最好,我应该能够要求客户下载此工具/实用程序,然后在服务器上运行它,以随意获得堆转储 我试过了,但是jvisualvm没有列出我们的产品jVM。它只列出当时运行的一些JVM,而不是当时运行的所有JVM。另外

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

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

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

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

最好,我应该能够要求客户下载此工具/实用程序,然后在服务器上运行它,以随意获得堆转储

我试过了,但是jvisualvm没有列出我们的产品jVM。它只列出当时运行的一些JVM,而不是当时运行的所有JVM。另外,jvisualvm非常庞大

注意:是否有第三方实用程序可以在JVM主机上执行以转储堆?此外,客户此时无法升级JRE。前面问题的答案中没有一个被选为答案

谢谢,

  • 要从JVM内转储堆,请使用
    com.sun.management.HotSpotDiagnosticXbean

        HotSpotDiagnosticMXBean hs =
                ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class);
        hs.dumpHeap("/path/to/heapdump.bin", false);
    
  • 要从外部转储另一个进程的堆,请使用。
    我为此编写了一个小型实用程序,请参见

    使用
    make
    生成程序,然后运行

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

  • 我看到了那个问题。考虑到2年前有人问过这个问题,我想看看是否有实用程序等可以完成任务。jattach是否会转储一个.hprof?我尝试在cygwin/windows上构建,但无法实现。我正在github中为同一问题创建问题。@anjanb是的,它转储.hprof,与jmap完全相同。我已经为Windows添加了jattach实现。谢谢。我会测试它,让你知道它是否适合我。