Java HeapDump 生成解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 堆转储是诊断在Java虚拟机中与内存相关的问题的重要文件,例如内存泄漏、应用请求缓慢,垃圾回收问题以及各种各样的java.lang.OutOfMemoryError异常。堆转储文件也是优化、分析内存消耗的重要工具。

      堆转储是诊断在Java虚拟机中与内存相关的问题的重要文件,例如内存泄漏、应用请求缓慢,垃圾回收问题以及各种各样的java.lang.OutOfMemoryError异常。堆转储文件也是优化、分析内存消耗的重要工具。

       Heap Dump 是 Java进程所使用的内存情况在某一时间的一次快照。以文件的形式持久化到磁盘中。Heap Dump的格式有很多种,而且不同的格式包含的信息也可能不一样。但总的来说,Heap Dump一般都包含了一个堆中的Java Objects, Class等基本信息。同时,当你在执行一个转储操作时,往往会触发一次GC,所以你转储得到的文件里包含的信息通常是有效的内容。

       具体地,Heap Dump文件包含的信息主要包含以下:

       1、所有的对象信息 :对象的类信息、字段信息、原生值(int, long等)及引用值

       2、所有的类信息 :类加载器、类名、超类及静态字段

       3、垃圾回收的根对象 :根对象是指那些可以直接被虚拟机触及的对象

       4、线程栈及局部变量 :转储时刻的线程调用栈信息和栈帧中的局部变量信息

      其实,针对HeapDump文件分析有很不错的工具,例如Eclipse MAT和Heap Hero,可以分析堆转储。但是,使用此类工具需要提供正确的格式和正确的时间点所捕获的堆转储。

       本文主要基于在Java程序问题存在性能问题,需要进行堆内存分析时进行捕获堆转储时,可借助的工具的介绍。        

1、jmap

       jmap打印堆转储到指定的文件位置。该工具打包在JDK中。 可以在\ bin文件夹中找到它,具体语法:


jmap -dump:格式= b,文件= <文件路径> <pid>
pid:Java进程ID,应捕获其堆转储
file-path:堆转储将写入的文件路径。
[administrator@JavaLangOutOfMemory ~ ] % jmap -dump:live,format=b,file=/data/logs/heap.hprof <pid>

      备注:传递“实时”选项非常重要。如果传递了此选项,则仅将内存中的活动对象写入堆转储文件。如果未通过此选项,则所有对象,即使是准备进行垃圾回收的对象,都将打印在堆转储文件中。它将大大增加堆转储文件的大小。这也将使分析变得乏味。要解决内存问题或优化内存,仅“ live”选项就足够了。      

2、HeapDumpOnOutOfMemoryError

      当应用程序遇到java.lang.OutOfMemoryError时,最好立即捕获堆转储以诊断问题,因为此刻想知道java.lang.OutOfMemoryError发生时内存中有哪些对象以及它们占内存的百分比。然而,由于各种原因,大多数情况下,IT运营或研发团队会忘记捕获堆转储。不仅如此,他们往往会重新启动应用程序以恢复业务。如果不及时捕获堆转储,很难诊断出任何内存问题。

      此参数选项配置非常简单。在应用程序启动脚步录入“ -XX:+ HeapDumpOnOutOfMemoryError”系统属性时,JVM会在JVM遇到OutOfMemoryError时立即捕获堆转储。具体用法示例:


-XX:+HeapDumpOnOutOfMemoryError -XX:+HeapDumpBeforeFullGC -XX:+HeapDumpAfterFullGC -XX:HeapDumpPath=

       备注:JVM 生成 Heap Dump 的时候,虚拟机是暂停一切服务的。如果是线上系统执行 Heap Dump 时需要注意。      

3、jcmd

      在JDK 1.7之后,新增了一个命令行工具jcmd。它是一个多功能工具,可以用来导出堆,查看Java进程,导出线程信息,执行GC等。 该工具打包在JDK中。 可以在\ bin文件夹中找到它,具体语法:


jcmd <pid> GC.heap_dump <file-path>
where
pid: is the Java Process Id, whose heap dump should be captured
file-path: is the file path where heap dump will be written in to.


[administrator@JavaLangOutOfMemory ~ ] % jcmd <pid> GC.heap_dump /data/logs/heapdump.bin

       

4、JVisualVM

       JVisualVM是一个监视,故障排除工具,打包在JDK中。 启动此工具时,您可以看到本地计算机上正在运行的所有Java进程。 您也可以使用此工具连接到在远程计算机上运行的Java进程。


     

5、JMX

     基于HotSpot虚拟机的诊断管理组件com.sun.management:type=HotSpotDiagnostic MBean。此MBean具有“ dumpHeap”操作。调用此操作将捕获堆转储。“ dumpHeap”操作采用两个输入参数:

      outputFile:应将堆转储写入的文件路径

      live:传递“ true”时,仅捕获堆中的活动对象

     可以使用JMX客户端(例如JConsole,jmxsh,Java Mission Control)来调用此MBean操作。

     

6、程序处理

      除了使用工具之外,还可以以代码嵌入方式从应用程序中捕获堆转储。在某些情况下,我们可能希望基于应用程序中的某些事件来捕获堆转储。 部分代码可参考如下:


import javax.management.MBeanServer;
import java.lang.management.ManagementFactory;
import com.sun.management.HotSpotDiagnosticMXBean;
public class HeapDumper {
    // This is the name of the HotSpot Diagnostic MBean
    private static final String HOTSPOT_BEAN_NAME =
         "com.sun.management:type=HotSpotDiagnostic";
    // field to store the hotspot diagnostic MBean 
    private static volatile HotSpotDiagnosticMXBean hotspotMBean;
    /\*\*
     \* Call this method from your application whenever you 
     \* want to dump the heap snapshot into a file.
     \*
     \* @param fileName name of the heap dump file
     \* @param live flag that tells whether to dump
     \*             only the live objects
     \*/
    static void dumpHeap(String fileName, boolean live) {
        // initialize hotspot diagnostic MBean
        initHotspotMBean();
        try {
            hotspotMBean.dumpHeap(fileName, live);
        } catch (RuntimeException re) {
            throw re;
        } catch (Exception exp) {
            throw new RuntimeException(exp);
        }
    }
    // initialize the hotspot diagnostic MBean field
    private static void initHotspotMBean() {
        if (hotspotMBean == null) {
            synchronized (HeapDumper.class) {
                if (hotspotMBean == null) {
                    hotspotMBean = getHotspotMBean();
                }
            }
        }
    }
    // get the hotspot diagnostic MBean from the
    // platform MBean server
    private static HotSpotDiagnosticMXBean getHotspotMBean() {
        try {
            MBeanServer server = ManagementFactory.getPlatformMBeanServer();
            HotSpotDiagnosticMXBean bean = 
                ManagementFactory.newPlatformMXBeanProxy(server,
                HOTSPOT_BEAN_NAME, HotSpotDiagnosticMXBean.class);
            return bean;
        } catch (RuntimeException re) {
            throw re;
        } catch (Exception exp) {
            throw new RuntimeException(exp);
        }
    }
    public static void main(String[] args) {
        // default heap dump file name
        String fileName = "heap.bin";
        // by default dump only the live objects
        boolean live = true;
        // simple command line options
        switch (args.length) {
            case 2:
                live = args[1].equals("true");
            case 1:
                fileName = args[0];
        }
        // dump the heap
        dumpHeap(fileName, live);
    }
}

     通过调用com.sun.management:type=HotSpotDiagnostic MBean JMX Bean,提供从应用程序捕获堆转储的源代码。      

7、IBM管理控制台

      如果应用程序在IBM Websphere Application Server上运行,则可以使用管理控制台来生成堆。具体步骤如下

       1、启动管理控制台

       2、在导航窗格中,单击故障排除> Java转储和核心

       3、选择要为其生成堆转储的server_name

       4、单击“堆转储”以生成指定服务器的堆转储。

       当然,我们还可以使用wsadmin生成堆转储。

相关文章
|
29天前
|
存储 Java 计算机视觉
Java二维数组的使用技巧与实例解析
本文详细介绍了Java中二维数组的使用方法
46 15
|
7天前
|
XML JSON Java
Java中Log级别和解析
日志级别定义了日志信息的重要程度,从低到高依次为:TRACE(详细调试)、DEBUG(开发调试)、INFO(一般信息)、WARN(潜在问题)、ERROR(错误信息)和FATAL(严重错误)。开发人员可根据需要设置不同的日志级别,以控制日志输出量,避免影响性能或干扰问题排查。日志框架如Log4j 2由Logger、Appender和Layout组成,通过配置文件指定日志级别、输出目标和格式。
|
29天前
|
算法 搜索推荐 Java
【潜意识Java】深度解析黑马项目《苍穹外卖》与蓝桥杯算法的结合问题
本文探讨了如何将算法学习与实际项目相结合,以提升编程竞赛中的解题能力。通过《苍穹外卖》项目,介绍了订单配送路径规划(基于动态规划解决旅行商问题)和商品推荐系统(基于贪心算法)。这些实例不仅展示了算法在实际业务中的应用,还帮助读者更好地准备蓝桥杯等编程竞赛。结合具体代码实现和解析,文章详细说明了如何运用算法优化项目功能,提高解决问题的能力。
58 6
|
29天前
|
存储 算法 搜索推荐
【潜意识Java】期末考试可能考的高质量大题及答案解析
Java 期末考试大题整理:设计一个学生信息管理系统,涵盖面向对象编程、集合类、文件操作、异常处理和多线程等知识点。系统功能包括添加、查询、删除、显示所有学生信息、按成绩排序及文件存储。通过本题,考生可以巩固 Java 基础知识并掌握综合应用技能。代码解析详细,适合复习备考。
21 4
|
1月前
|
存储 分布式计算 Hadoop
基于Java的Hadoop文件处理系统:高效分布式数据解析与存储
本文介绍了如何借鉴Hadoop的设计思想,使用Java实现其核心功能MapReduce,解决海量数据处理问题。通过类比图书馆管理系统,详细解释了Hadoop的两大组件:HDFS(分布式文件系统)和MapReduce(分布式计算模型)。具体实现了单词统计任务,并扩展支持CSV和JSON格式的数据解析。为了提升性能,引入了Combiner减少中间数据传输,以及自定义Partitioner解决数据倾斜问题。最后总结了Hadoop在大数据处理中的重要性,鼓励Java开发者学习Hadoop以拓展技术边界。
50 7
|
29天前
|
存储 Java
【潜意识Java】期末考试可能考的选择题(附带答案解析)
本文整理了 Java 期末考试中常见的选择题,涵盖数据类型、控制结构、面向对象编程、集合框架、异常处理、方法、流程控制和字符串等知识点。每道题目附有详细解析,帮助考生巩固基础,加深理解。通过这些练习,考生可以更好地准备考试,掌握 Java 的核心概念和语法。
32 1
|
29天前
|
Java 编译器 程序员
【潜意识Java】期末考试可能考的简答题及答案解析
为了帮助同学们更好地准备 Java 期末考试,本文列举了一些常见的简答题,并附上详细的答案解析。内容包括类与对象的区别、多态的实现、异常处理、接口与抽象类的区别以及垃圾回收机制。通过这些题目,同学们可以深入理解 Java 的核心概念,从而在考试中更加得心应手。每道题都配有代码示例和详细解释,帮助大家巩固知识点。希望这些内容能助力大家顺利通过考试!
20 0
|
3月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
132 2
|
2月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
2月前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析

推荐镜像

更多