【Arthas命令实践】heapdump实现原理

🎮 作者主页:点击

🎁 完整专栏和代码:点击

🏡 博客主页:点击

文章目录

使用

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 则转储整个堆,包括未被引用的对象)。存活对象是指当前堆中仍然有引用指向的对象。

相关推荐
Java搬码工4 小时前
CompletableFuture 完整详解 + 全场景使用案例
java
许心月4 小时前
Java学习资料网站汇总
java
c238564 小时前
第二篇:《测试指挥官:可视化单题自测框架(含 assert 实操)》
java·数据库·c++·算法·安全性测试
辞旧 lekkk5 小时前
【Redis初阶】常见数据类型
开发语言·数据库·c++·redis·学习·缓存·bootstrap
帅次5 小时前
Kotlin 与 Java 互操作:混合工程里的平台类型与 API 边界
java·开发语言·kotlin·suspend·nullable
X-⃢_⃢-X5 小时前
一、第一阶段:认识 Spring Boot
java·spring boot·后端
前端工作日常6 小时前
我学习到的Java程序的生命周期
java·后端
SunnyDays10116 小时前
Java 实现 PDF 页面删除、排序、旋转和裁剪
java·pdf
人工干智能6 小时前
科普:Pandas 索引器 loc 与 iloc 的编程思维
java·人工智能·pandas
dtq04247 小时前
C语言-结构体详解
c语言·开发语言·学习