我想出于教育目的创建Java堆转储分析器项目。我更喜欢在应用程序内部捕获转储文件,而不是将转储文件作为参数。但是我不知道该怎么做。
我想到了通过给PID来在Runtime中运行“ jmap -dump ...”命令,但是我不确定这是否是正确的方法。您能帮我吗?
您仍然需要指定保存转储的文件名。
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();
}
}
}