🎮 作者主頁:點擊
🎁 完整專欄和代碼:點擊
🏡 博客主頁:點擊
文章目錄
- 使用
- 原理
使用
dump java heap, 類似 jmap 命令的 heap dump 功能。
【dump 到指定文件】
heapdump arthas-output/dump.hprof
【只 dump live 對象】
heapdump --live /tmp/dump.hprof
【dump 到臨時文件】
heapdump
原理
arthas實現類 HeapDumpCommand
@Overridepublic 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命令的代碼
/*** 生成堆轉儲文件* @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 則轉儲整個堆,包括未被引用的對象)。存活對象是指當前堆中仍然有引用指向的對象。