前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >获取JVM转储文件的Java工具类

获取JVM转储文件的Java工具类

作者头像
FunTester
发布2019-12-17 11:12:54
7820
发布2019-12-17 11:12:54
举报
文章被收录于专栏:FunTesterFunTester

在上期文章如何获取JVM堆转储文件中,介绍了几种方法获取JVM的转储文件,其中编程方法是里面唯一一个从JVM内部获取的方法。这里就不演示了其他方法获取正在运行的应用程序的堆转储,重点放在了使用编程来获取转储文件的方法,并演示了如何使用jhat工具浏览/分析生成的二进制堆转储。

你可能想在各个时间点从应用程序中转储多个堆快照,然后使用jhat离线分析这些快照。如何以编程方式从应用程序中转储堆?下面给出了一个例子。您可以从应用程序中转储堆,但必须进行一些编程,如下所示:

代码语言:javascript
复制
package com.fun.utils;

import com.fun.frame.SourceCode;
import com.sun.management.HotSpotDiagnosticMXBean;
import org.slf4j.Logger;

import javax.management.MBeanServer;
import java.lang.management.ManagementFactory;

public class HeapDumper extends SourceCode {

    private static Logger logger = getLogger();

    /**
     * 这是HotSpot Diagnostic MBean的名称
     */
    private static final String HOTSPOT_BEAN_NAME = "com.sun.management:type=HotSpotDiagnostic";

    /**
     * 用于存储热点诊断MBean的字段
     */
    private static volatile HotSpotDiagnosticMXBean hotspotMBean;

    /**
     * 下载内存转储文件
     *
     * @param fileName 文件名,例如:heap.bin,不兼容路径,会在当前目录下生成
     * @param live
     */
    static void dumpHeap(String fileName, boolean live) {
        initHotspotMBean();
        try {
            hotspotMBean.dumpHeap(fileName, live);
        } catch (Exception e) {
            logger.error("生成内存转储文件失败!", e);
        }
    }

    /**
     * 初始化热点诊断MBean
     */
    private static void initHotspotMBean() {
        if (hotspotMBean == null) {
            synchronized (HeapDumper.class) {
                if (hotspotMBean == null) {
                    try {
                        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
                        hotspotMBean = ManagementFactory.newPlatformMXBeanProxy(server, HOTSPOT_BEAN_NAME, HotSpotDiagnosticMXBean.class);
                    } catch (Exception e) {
                        logger.error("初始化mbean失败!", e);
                    }
                }
            }
        }
    }


}
  • 重要说明:虽然可以从应用程序中转储多个堆快照,但不能将多个转储中的对象相关联。jmap工具使用对象地址作为对象标识符-在垃圾回收之间有所不同[回想一下GC可能会移动更改对象地址的对象]。但是,您可以通过汇总统计数据(例如直方图等)进行关联。

下面将生产好的heap.bin文件拉回到本地或者在服务端用jhat -port 8888 heap.bin工具进行处理,然后访问:http://localhost:8888即可查看当时JVM堆内存的使用情况。如图:


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档