如何在Java应用程序内部创建堆转储?

问题描述 投票:0回答:1

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

我想到了通过给PID来在Runtime中运行“ jmap -dump ...”命令,但是我不确定这是否是正确的方法。您能帮我吗?

java jvm
1个回答
0
投票

使用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();
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.