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


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

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

    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堆内存的使用情况。
    如图:


  • 相关阅读:
    quartz_jobs.xml的问题
    Enum.GetHashCode()的问题
    记录并分享一下安卓通讯录导入到IPhone
    js本地图片预览
    统计一下ie的一些问题(什么时候遇到什么时候更新)
    【转载】App.config/Web.config 中特殊字符的处理
    信息系统项目管理师备考笔记——项目生命周期和组织
    win10安装.net3.5
    结售汇与外汇买卖区别
    [z]数据库迁移
  • 原文地址:https://www.cnblogs.com/FunTester/p/12009518.html
Copyright © 2020-2023  润新知