🎮 作者主页:点击
🎁 完整专栏和代码:点击
🏡 博客主页:点击
文章目录
使用
dump java heap, 类似 jmap 命令的 heap dump 功能。
【dump 到指定文件】
heapdump arthas-output/dump.hprof
【只 dump live 对象】
heapdump --live /tmp/dump.hprof
【dump 到临时文件】
heapdump
原理
arthas实现类 HeapDumpCommand
java
@Override
public void process(CommandProcess process) {
try {
String dumpFile = file;
if (dumpFile == null || dumpFile.isEmpty()) {
String date = new SimpleDateFormat("yyyy-MM-dd-HH-mm").format(new Date());
File file = File.createTempFile("heapdump" + date + (live ? "-live" : ""), ".hprof");
dumpFile = file.getAbsolutePath();
file.delete();
}
process.appendResult(new MessageModel("Dumping heap to " + dumpFile + " ..."));
run(process, dumpFile, live);
process.appendResult(new MessageModel("Heap dump file created"));
process.appendResult(new HeapDumpModel(dumpFile, live));
process.end();
} catch (Throwable t) {
String errorMsg = "heap dump error: " + t.getMessage();
logger.error(errorMsg, t);
process.end(-1, errorMsg);
}
}
private static void run(CommandProcess process, String file, boolean live) throws IOException {
HotSpotDiagnosticMXBean hotSpotDiagnosticMXBean = ManagementFactory
.getPlatformMXBean(HotSpotDiagnosticMXBean.class);
hotSpotDiagnosticMXBean.dumpHeap(file, live);
}
主要实现dump命令的代码
java
/**
* 生成堆转储文件
* @param fileName 堆转储文件的输出路径
* @param live 是否只转储存活对象
* @throws Exception
*/
public static void dumpHeap(String fileName, boolean live) throws Exception {
HotSpotDiagnosticMXBean hotSpotDiagnosticMXBean = ManagementFactory
.getPlatformMXBean(HotSpotDiagnosticMXBean.class);
// 调用 dumpHeap 方法生成堆转储
hotSpotDiagnosticMXBean.dumpHeap(fileName, live);
}
这段代码的作用是生成堆转储文件。这个方法的作用是使用 HotSpotDiagnosticMXBean 来调用 JVM 的原生堆转储功能,并将堆转储文件保存到指定路径。
ManagementFactory 是 Java 的标准类库,用于获取 JMX(Java Management Extensions)相关的管理接口和 MBean。getPlatformMXBean 方法用于获取特定平台的 MBean。在这里,获取的是 HotSpotDiagnosticMXBean 的实例。HotSpotDiagnosticMXBean 是 JVM 提供的一个接口,允许应用程序获取和管理 JVM 的诊断信息。它提供了 dumpHeap 方法,能够生成堆转储文件。
fileName:指定堆转储文件的保存路径和文件名。该路径是生成的堆转储文件将保存到的位置。
live:指示是否只转储存活对象(true 表示只转储存活的对象,false 则转储整个堆,包括未被引用的对象)。存活对象是指当前堆中仍然有引用指向的对象。