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

相关推荐
刘立军20 分钟前
使用pyHugeGraph查询HugeGraph图数据
python·graphql
浮游本尊1 小时前
Java学习第22天 - 云原生与容器化
java
渣哥3 小时前
原来 Java 里线程安全集合有这么多种
java
间彧3 小时前
Spring Boot集成Spring Security完整指南
java
间彧3 小时前
Spring Secutiy基本原理及工作流程
java
数据智能老司机4 小时前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
Java水解4 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
数据智能老司机5 小时前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
c8i6 小时前
django中的FBV 和 CBV
python·django
c8i6 小时前
python中的闭包和装饰器
python