利用MAT分析JVM内存问题,从入门到精通(二)
上一篇文章MAT入门到精通(一)介绍了MAT的使用场景和基本概念,这篇文章开始介绍MAT的基本功能,后面还有两篇,一篇是MAT的高级功能,另一篇是MAT实战案例分析。
三、欢迎页
使用MAT打开一个heap dump文件,解析完成后,默认会进入欢迎页,欢迎页里包含了一些常见的分析:最大内存占用分析、常见的分析动作、常用的分析报告、MAT使用教程等等。
我们看下下面这张图,可以看出MAT的主要结构和功能:
- inspector:透视图,用于展示一个对象的详细信息,例如内存地址、加载器名称、包名、对象名称、对象所属的类的父类、对象所属的类的加载器对象、该对象的堆内存大小和保留大小,gc root信息。
- inspector窗口的下半部分是展示类的静态属性和值、对象的实例属性和值、对象所属的类的继承结构。
- Heap Dump History:用于列举最近分析过的文件
- 常用功能栏,从左到右依次是:概览、类直方图、支配树、OQL查询、线程视图、报告相关、详细功能。其中概览就是在刚解析完后展示的这个页面,详细功能按钮则是提供了一些更细致的分析能力。
- 概览中的饼图:该饼图用于展示retained size最大的对象
- 常用的分析动作:类直方图、支配树、按照类和包路径获取消耗资源最多的对象、重名类。
- 报告相关:Leak Suspects用于查找内存泄漏问题,以及系统概览
- Components Report:这个功能是一组功能的集合,用于分析某一类性的类的实例的问题,例如分析
java.util.*
开头的类的实例对象的一些使用情况,例如:重复字符串、空集合、集合的使用率、软引用的统计、finalizer的统计、Map集合的碰撞率等等。
四、基本功能
关于概览页面,我们再上一节已经进行过分析,这里不再赘述。我们在这一小节,将重点放在功能栏那一栏,即类直方图、支配树、OQL查询、线程视图等功能。
4.1 类直方图
堆直方图是从类的角度看哪些类及该类的实例对象占用着内存情况,默认是按照某个类的shallow heap大小从大到小排序。
Retained Heap这一列的值是空的,因为对于某个类的所有实例计算总的retained heap非常慢,因此使用者需要按需计算。
在直方图页面,可以选择某个条目右键进行分析,例如对所有类的对象做一些分析动作。
在直方图页面,还有一个重要的特性——可以选择一些其他维度进行分类分析,例如superclass、class loader、package。
如果选择按照package来分类,则可以看到下面这种视图
4.2 支配树
支配树可以用于查看heap dump中占用内存最大的对象。在支配树中,对于某一层的节点来说,如果它们的parent节点没有被其他对象引用了,那么这写节点都会被垃圾收集器回收。
支配树可以用来排查是哪些对象导致了其他对象无法被垃圾收集器回收,跟类直方图类似,支配树也从类加载器、package等角度来看。
[图片上传失败...(image-ec386f-1550075801691)]
4.3 OQL查询
MAT提供另一种类似SQL的对象查询语言——OQL,可以用类似SQL语句的方式查询heap dump中的对象。OQL和关系型数据库具备类似的数据模型:将某个类看作是一张表,将该类的实例对象看作是该表中的行,每个对象中的属性看作是构成行的列。
OQL语言的语法结构如下:
SELECT *
FROM [ INSTANCEOF ] <class name="name">
[ WHERE <filter-expression> ]
</filter-expression></class>
OQL编辑器分为两个区域:
- 上半部分的区域用于输入查询语句
- 下半部分的区域用于展示查询语句执行的结果
下图是查询当前堆里所有的String对象的语句和结果:
4.4 线程视图
通过上图中的那个按钮,可以查看线程视图,线程视图首先给出了在生成快照那个时刻,JVM中的Java线程对象列表。这个按钮的功能,等同于下图中的这个操作:
在线程视图这个表中,可以看到以下几个信息:线程对象的名字、线程名、线程对象占用的堆内存大小、线程对象的保留堆内存大小、线程的上下文加载器、是否为守护线程。
选中某个线程对象展开,可以看到线程的调用栈和每个栈的局部变量,通过查看线程的调用栈和局部变量的内存大小,可以找到在哪个调用栈里分配了大量的内存。
因此,heap dump和MAT不仅仅用于排查内存相关的问题,也有助于排查线程相关的问题。
4.5 问题分析
上图中的这个按钮,是MAT提供的一些常见的问题分析能力。因为这些问题特别常见,所以MAT就提供了对应的组合功能,帮用户快速定位常见问题。
Heap Dump Overview
Heap Dump Overview就是整个堆的概括情况,例如:堆内存大小、对象个数、类的个数、类加载器的个数、GC root的个数、堆内存文件的格式、文件的创建时间、位置等信息。这个页面还开一个看一些系统属性、线程概览、Top内存耗费组件、类直方图等信息。Leak Suspects
如下图所示,这个功能用于排查潜在的内存泄漏问题。Top Components
针对那些占用堆内存超过整个堆内存1%大小的组件做一系列的分析,例如:Top Consumers、保留集合、潜在的内存浪费问题等其他问题。
这一系列的分析,有很多层次,可以用下面这张思维导图理解:
4.6 对象查找
MAT支持根据对象的十六进制地址查找对象的outbound引用视图,如下图所示:
这个功能等同于在直方图中选中某个对象,然后右键列举该对象的outbound引用视图:
本号专注于后端技术、JVM问题排查和优化、Java面试题、个人成长和自我管理等主题,为读者提供一线开发者的工作和成长经验,期待你能在这里有所收获。
利用MAT分析JVM内存问题,从入门到精通(二)的更多相关文章
- 大数据学习--day13(字符串String--源码分析--JVM内存分析)
字符串String--源码分析--JVM内存分析 String 类的对象 , 是不可变的字符串对象呢 这个不可变很重要,之后要讲的intern()也离不开它的不可变性. https://www.cnb ...
- iOS开发-UI 从入门到精通(二)
iOS开发-UI 从入门到精通(二)是对 iOS开发-UI 从入门到精通(一)知识点的巩固,主要以习题练习为主,增强实战经验,为以后做开发打下坚实的基础! ※开发环境和注意事项: 1.前期iOS-UI ...
- 使用MAT分析Java内存
Overview MAT(Memory Analyzer Tool) 是一个JAVA Heaper分析器,可以用来分析内存泄露和减少内存消耗.分析Process showmap中的/dev/ashme ...
- Python基本语法,python入门到精通[二]
在上一篇博客Windows搭建python开发环境,python入门到精通[一]我们已经在自己的windows电脑上搭建好了python的开发环境,这篇博客呢我就开始学习一下Python的基本语法.现 ...
- PHP从入门到精通(二)
PHP从入门到精通 之PHP中的函数 各位开发者朋友大家好,自上次更新PHP的相关知识,得到了大家的广泛支持.PHP的火爆程度不言而喻,函数作为PHP中极为重要的部分,应诸位的支持,博主继续跟进更新 ...
- MyBatis从入门到精通(二):MyBatis XML方式的基本用法之Select
最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 1. 明确需求 书中提到的需求是一个基 ...
- 使用jmap和MAT分析JVM堆内存
http://blog.csdn.net/alli0968/article/details/52460008
- MAT分析android内存泄漏
转载请标明出处:https://www.cnblogs.com/tangZH/p/10955429.html 泄漏,泄漏,漏~ 内存泄漏怎么破,什么是内存泄漏?与内存溢出有什么区别? 内存泄漏(Mem ...
- jstat分析JVM内存
zabbix: Jstat:gcutil:Old space utilization(%) S0 — Heap上的 Survivor space 0 区已使用空间的百分比S1 — Heap上的 S ...
随机推荐
- ‘3 sigma’rule(68–95–99.7 rule)
不限标准正太分布,任一正太分布(normal distribution)均可. 围绕均值附近求得的区间概率: (μ−k⋅σ,μ+k⋅σ) Pr(μ−σ≤x≤μ+σ)≈0.6827Pr(μ−2σ≤x≤μ ...
- react项目实践——(1)使用webpack创建项目
1. 新建文件夹,命名为项目名称——myapp,并打开myapp文件夹. mkdir webpack-demo && cd webpack-demo 2. 在./myapp中打开命令行 ...
- 开源 自由 java CMS - FreeCMS1.9 积分规则管理
项目地址:http://www.freeteam.cn/ 积分规则管理 管理会员操作时积分处理规则. 1. 积分规则管理 从左側管理菜单点击积分规则进入. 2. 加入积分规则 在积分规则列表下方点击& ...
- Aspect Oriented Programming面向切面编程
I简介 Aspect Oriented Programming(AOP),面向切面编程,是一个比较热门的话题.AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或 ...
- Spring 核心技术(1)
接上篇:Spring 框架概述 version 5.1.8.RELEASE 这部分参考文档涵盖了 Spring Framework 所有绝对不可或缺的技术. 其中最重要的是 Spring Framew ...
- 关于WPF的ComboBox中Items太多而导致加载过慢的问题
原文:关于WPF的ComboBox中Items太多而导致加载过慢的问题 [WFP疑难]关于WPF的ComboBox中Items太多而导致加载过慢的问题 ...
- QLocalServer与QLocalSocket进程通讯
在Qt中,提供了多种IPC方法,作者所用的是QLocalServer和QLocalSocket.看起来好像和Socket搭上点边,实则底层是windows的name pipe.这应该是支持双工通信的. ...
- Image Captioning 经典论文合辑
Image Caption: Automatically describing the content of an image domain:CV+NLP Category:(by myself, y ...
- C#程序以管理员的身份运行
在一些特定的情况下我们需要能够有管理员的权限,这样我们的很多执行,或者写入就不会报错了. 1.解决方案资源管理器---->项目(右键)--->属性-->安全性 2.勾选“启用Clic ...
- 微信小程序把玩(十六)form组件
原文:微信小程序把玩(十六)form组件 form表单组件 是提交form内的所有选中属性的值,注意每个form表单内的组件都必须有name属性指定否则提交不上去,button中的type两个subm ...