我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java内存分析利器MAT的使用详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java内存分析利器MAT的使用详解

本篇内容主要讲解“Java内存分析利器MAT的使用详解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java内存分析利器MAT的使用详解”吧!

dump文件包含的内容:

1,全部的对象:类,域,原生值和引用;

2,全部的类:classloader,类名,超类,静态域;

3,GC root:被JVM定义的可触达的对象;

4,线程栈和本地变量:线程的call stack,本地对象每帧的信息。

dump文件不包含内存的分配信息,因此无法查询谁创建了哪个对象这样的信息。

Shallow heap是一个对象占用的内存空间,一个对象需要32或者64bits。

Retained set of X是X在被jvm gc回收后被remove的一组object。

Retained heap of X是在retained set of X中的所有对象的shallow heap size的和。换句话说就是保持X活着需要的内存空间。

通俗的讲,shallow heap是一个对象在内存中的实际空间,而retained heap是一个对象被gc回收后内存释放出来的空间。

Java内存分析利器MAT的使用详解

这张图可以看懂什么是leading set什么是retained set。

Dominator tree:定义一个对象x dominate  对象y,当每一条从root开始到y的路径都经过x。说白了就是只要有y对象的存活,那么一定会有一个x对象。Dominator  tree就是将对象引用图转换成的树形结构。帮助发现在对象间保持alive的依赖,同时也能识别出retained内存的***的chunk。  Immediate dominator x of y是离y最近的dominator。

Dominator tree有几个属性:

1,对象x的子树包含的对象(x dominate的对象集),代表了x的retained set;

2,如果x是y的immediate dominator,那么x的immediate dominator同样dominate y,以此类推;

3,dominate tree中的边不代表对象引用图里对应的边,并非严格的直接的对象引用。

Java内存分析利器MAT的使用详解

这张图反应了一个对象引用图转换成dominator tree的示例。

Gc root:一个gc根就是一个对象,这个对象从堆外可以访问读取。以下一些方法可以使一个对象成为gc根。

1,System class:被Bootstrap或者system类加载器加载的类,比如rt.jar里的java.util.*;

2,JNI local:native代码里的local变量,比如用户定义的JNI代码和JVM的内部代码;

3,JNI global:native代码里的global变量;

4,Thread block:当前活跃的线程block中引用的对象;

5,Thread:已经启动并且没有stop的线程;

6,busy monitor:被调用了wait()或者notify()或者被synchronized同步的对象,如果是synchronized方法,那么静态方法指的类,非静态方法指的是对象;

7,java local:local变量,比如方法的入参和方法内创建的变量;

8,native stack:native代码里的出入参数,比如file/net/IO方法以及反射的参数;

9,finalizable:在一个队列里等待它的finalizer 运行的对象;

10,unfinalized:一个有finalize方法的对象,还没有被finalize,同时也没有进入finalizer队列等待finalize;

11,unreachable:不会被触碰到的对象,在MAT里被标记为root用来retain object,否则是不会在分析中出现的;

12,java stack frame:java栈帧包含了本地变量,当dump被解析时且在preferences里设置过把栈帧当做对象,这时才会产生;

13,unknown:位置的root类型。

接下来是一些获取dump的方法:

1,在oom时dump:JVM参数:-XX:+HeapDumpOnOutOfMemoryError

2,交互式环境下dump:

1)JVM参数:-XX:+HeapDumpOnCtrlBreak

2)用外部tools:jmap -dump:format=b,file=<filename.hprof> <pid>

3)用外部tools:jconsole

4)用外部工具:MAT

5)kill -3 <pid>

6)jstack -l <pid> > <dumpfile>

一些排查方法:

1,通过top consumers查找大对象,可以按照class、classloader和package进行group by;

2,通过immediate dominator找到责任对象,对于快速定位一组对象的持有者非常有用,这个操作直接解决了“谁让这些对象alive”的问题,而不是“谁有这些对象的引用”的问题,更直接高效;

3,运行classloader分析,这个重要性体现在亮点:***,应用使用不同的classloader加载类,第二,不同  classloader加载的类存储在不同的***代,这理论上也是可以被回收的。当有一个类被不同的classloader加载时,这时要根据各自  loader下的instance数量判断哪个loader更重要,从而要把另一个回收掉;

4,分析线程,本身heap dump里包含了thread信息,可以通过MAT来查看threads  的overview和detail,detail中有线程的堆内存信息,也有线程栈,同时还包含了操作系统本地栈。假设不做heap  dump,我们检查到系统有问题,如何通过线程的角度来排查呢?首先top -H -p  <pid>以线程的模式查看java应用的运行情况,找到占用cpu或者内存大的线程,记录线程id,然后printf %x  <tid>转为16进制,再jstack -l <pid> > thread.log把java进程的thread  dump出来,从里面找到tid,分析是哪个线程占用了系统资源。

5,分析java容器类,因为java的容器类是最常用来存储对象的,所以理论上发生内存泄露的风险也***。可以从几个角度来  看:1)array填充率查询(填充率fill  ratio是数组中非空元素的比例),打印非原生类型数组的填充率频率分布,从而排查系统中array的利用率;2)数组按照size分组查询,打印一个  按size分组的直方图;3)collection的填充率查询,ArrayList/HashMap/Hashtable/Properties  /Vector/WeakHashMap/ConcurrentHashMap$Segment;4)collection按照size分组直方图;5)   查看一个list里的所有对象;6)查看hashmap里的所有对象;7)查看hashset里的对象;8)检查map的碰撞率;9)检查所有只有一个常  量的array。

6,分析Finalizer,1)查询finalizer正在处理的对象;2)查询finalizer准备处理的对象;3)直接查看finalizer线程;4)查看finalizer线程的thread local对象。

到此,相信大家对“Java内存分析利器MAT的使用详解”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java内存分析利器MAT的使用详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java内存分析利器MAT的使用详解

本篇内容主要讲解“Java内存分析利器MAT的使用详解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java内存分析利器MAT的使用详解”吧!dump文件包含的内容:1,全部的对象:类,域,原生
2023-06-17

Java 内存溢出(二)使用 MAT 分析 .hprof 内存映像文件

目录 一、内存溢出时自动导出 .hprof 文件二、下载安装 MAT三、启动 MAT四、MAT 分析 hprof 文件1.Overview 概览2.Leak Suspects 溢出原因猜测3.Histogram 对象实例数量排序4.
2023-08-18

使用MAT进行JVM内存分析实例

这篇文章主要介绍了使用MAT进行JVM内存分析实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-18

详解Android内存泄漏检测与MAT使用

内存泄漏基本概念 内存检测这部分,相关的知识有JVM虚拟机垃圾收集机制,类加载机制,内存模型等。编写没有内存泄漏的程序,对提高程序稳定性,提高用户体验具有重要的意义。因此,学习Java利用java编写程序的时候,要特别注意内存泄漏相关的问题
2022-06-06

关于java中堆内存与栈内存的详细分析

一、概述在Java中,内存分为两种,一种是栈内存,另一种就是堆内存。二、堆内存1、什么是堆内存?堆内存是Java内存中的一种,它的作用是用于存储Java中的对象和数组,当我们new一个对象或者创建一个数组的时候,就会在堆内存中开辟一段空间给它,用于存放。2、堆
关于java中堆内存与栈内存的详细分析
2017-04-01

在 SAP 中使用内存分析器

有很多免费和专有的工具可以实现同样的功能。您可以使用 SAP 完成的内存分析器项目。它可以让您通过简单的 SQL 语句查找内存中对象的内存泄漏。此外,您还可以使用JHAT(Java堆分析工具)命令行工具来检查内存。它可以让您通过直方图检查
2023-10-22

MySql存储过程循环的使用分析详解

目录简介场景描述解决方案案例总结简介每一门数据库语言语法都基本相似,但是对于他们各自的一些特性(函数、存储过程等)的用法就不大相同了,就好比Oracle与mysql存储过程写起来就很多不同的地方,在这里主要是跟大家分享一下MySql存储过
2022-06-29

利用Java实现解析网页中的内容

这篇文章主要为大家详细介绍了如何利用Java语言做一个解析指定网址的网页内容小应用,文中的实现步骤讲解详细,感兴趣的可以尝试下
2022-11-13

Java应用程序中内存泄漏及内存管理的示例分析

这篇文章主要介绍Java应用程序中内存泄漏及内存管理的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!btw,一些静态代码扫描工具也能检测出不好的编程习惯带来潜在的内存泄露的风险。Java平台的一个突出的特性是
2023-06-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录