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

相关推荐
九离十1 分钟前
C语言教程——指针进阶(1)
c语言·开发语言
Channing Lewis2 分钟前
经典编程题:服务器广播
python·算法
胡耀超4 分钟前
解读若依框架中的`@Excel` 和 `@Excels` 注解
java·excel·若依
DevOpsDojo5 分钟前
Julia语言的软件工程
开发语言·后端·golang
编程|诗人11 分钟前
Kotlin语言的数据结构
开发语言·后端·golang
拾忆,想起19 分钟前
Spring拦截链揭秘:如何在复杂应用中保持控制力
java·数据库·spring
HelloZheQ22 分钟前
Spring 中的 @RestController 注解详解
java·后端·spring
观棋不语的我29 分钟前
maven下载依赖报错:on-resolvable parent POM xxx
java·maven
羊小猪~~29 分钟前
C/C++语言基础--C++STL库算法记录(质变算法、非质变算法、查找、排序、排列组合、关系算法、集合算法、堆算法等)
c语言·开发语言·数据结构·c++·算法·stl
程序员老冯头35 分钟前
第三十六章 C++ 多线程
java·c++·信号处理