java - 如何在 Java 应用程序中创建堆转储?

标签 java jvm

我想创建一个用于教育目的的 Java 堆转储分析器项目。我更喜欢在应用程序中捕获转储文件,而不是将转储文件作为参数。但我不知道该怎么做。

我想通过提供 PID 来使用运行时运行 jmap -dump... 命令,但我不确定这是否是正确的方法。你能帮我吗?

最佳答案

使用Dynamic Attach API .

您仍然需要指定保存转储的文件名。

import com.sun.tools.attach.VirtualMachine;
import sun.tools.attach.HotSpotVirtualMachine;

import java.io.InputStream;

public class HeapDump {

    public static void main(String[] args) throws Exception {
        String pid = args[0];
        HotSpotVirtualMachine vm = (HotSpotVirtualMachine) VirtualMachine.attach(pid);

        try (InputStream in = vm.dumpHeap("/tmp/heapdump.hprof")) {
            byte[] buf = new byte[200];
            for (int bytes; (bytes = in.read(buf)) > 0; ) {
                System.out.write(buf, 0, bytes);
            }
        } finally {
            vm.detach();
        }
    }
}

关于java - 如何在 Java 应用程序中创建堆转储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59164729/

相关文章:

java - 多模块 spring boot 项目 messages.properties 未加载

java - 尝试签署openjdk时“already signed”错误

java - 覆盖 "this"- GroovyShell 中的关键字

java - 为什么 Tomcat 会为我的应用程序打开那么多 Java 进程?

java - JVM 内部分析器?

java - J2EE Struts、Spring 和 Hibernate 框架问题

java - 将具有条件的列连接到 JPA 实体

java - 同一虚拟机中不同应用程序之间的通信

java - 从 JVM 检索 jar 文件?

java - 将整个文件传递给 JVM 参数