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

相关推荐
凤山老林3 小时前
新一代Java应用日志可视化与监控系统开源啦
java·后端·开源
流星白龙3 小时前
【Qt】7.信号和槽_connect函数用法(2)
java·数据库·qt
金涛03193 小时前
QT-day2,信号和槽
开发语言·qt·命令模式
C嘎嘎嵌入式开发3 小时前
(六)机器学习之图卷积网络
人工智能·python·机器学习
DataLaboratory6 小时前
Python爬取百度地图-前端直接获取
爬虫·python·百度地图
黎宇幻生7 小时前
Java全栈学习笔记39
java·笔记·学习
Aurorar0rua7 小时前
C Primer Plus Notes 09
java·c语言·算法
nongcunqq8 小时前
abap 操作 excel
java·数据库·excel
Turnsole_y9 小时前
pycharm自动化测试初始化
python·selenium
R-G-B9 小时前
【02】C#入门到精通——C# 变量、输入/输出、类型转换
开发语言·c#·c# 变量·c#输入/输出·c#类型转换