mat分析内存总结--性能分析
主要是工作中发现后台项目有时候话boom,看日志也会偶尔看到内存不足的报错。为了定位原因改善由于内存问题引起的性能问题特做个总结给大家参考。主要分了三个阶段做这个事情。由于截图及脚本涉及业务省略,有需要欢迎留言交流。
初步思路
后台系统性能参考指标很多方面需要参考,本次实践主要针对应用服务器的内存作为主要检测指标。主要思路如下:
1、TOP+Hp找到最大耗cpu线程,依赖jstack简单的找到线程耗cpu所在堆栈
2、实时监控内存回收状况如:jstat
3、在内存回收异常点保存堆栈镜像如:hump -dump:live,format=b,file=heap.bin pid
4、利用堆栈分析工具分析堆栈镜像定位可能耗性能代码
第一阶段
选用mat插件分析堆栈镜像,本地搭建好环境,主要目的及内容如下:
1、搭建基于eclipse的mat插件
2、确立主要检测指标及定位前提
3、思考怎么实时监控性能的指标
第二阶段
在性能不好的情况分析堆栈最有可能发现性能瓶颈,镜像文件是保留现场的重要文件。本阶段主要工作如下:
1、根据不同项目进程id自动生成镜像文件
2、常见场景如新老代内存使用率100%时,自动生成镜像文件
3、学习并尝试引进一种工具或者脚本实时监控系统主要性能参数如:cpu、内存、磁盘IO、带宽等。
第三阶段
mat工具及性能调优组内分享,并在使用中优化完善脚本。
主要内容:
1、输出调优分享及mat搭建文档
2、对使用过程提出的建议进行优化脚本
3、对引进监控性能主要参数最后确定
工 具 选 择
本阶段主要是选择分析堆栈的工具,及初步尝试使用工具定位堆栈镜像中使用内存的情况;梳理出常用定位步骤;编写或利用工具辅助监控内存的使用。
在工具选择mat插件(全称Memory Analyzer),和市场上其他同类工具如jvisualvm(jdk1.7以上自带)、jprofile等相比完胜对手。首先他是一个插件相对jprofile而言更轻量,在分析打内存的堆栈来说效率更快;
和jvisualvm相比提供了诸如Leak Suspects的报告,更直接准确的将可能有问题的地方暴露出来分析更准确。
初 步 定 位 方 法
先简单了解下jvm垃圾回收的过程。为构造jvm空间不足可适当调整jvm配置,参考:-Xms256M -Xmx512M -Xmn128M -Xss256k -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/logs 。
其中后面两个参数是当内存报OutOfMemoryError ,会在/var/logs 路径下生成一个dump文件提供分析定位,也可手工主动生成dump文件,方法如下:
现在将镜像文件导入mat,它为我们提供了多个报告:
从上图可以看到它的大部分功能,在饼图上,你会发现转储的大小和数量的类,对象和类加载器。
正确的下面,饼图给出了一个印象最大的对象转储。移动你的鼠标一片看到对象中的对象的细节检查在左边。下面的Action标签中:
Histogram可以列出内存中的对象,对象的个数以及大小。
Dominator Tree可以列出那个线程,以及线程下面的那些对象占用的空间。
Top consumers通过图形列出最大的object。
Leak Suspects通过MA自动分析泄漏的原因。
histogram
Shallow Heap :一个对象内存的消耗大小,不包含对其他对象的引用
Retained Heap :是shallow Heap的总和,也就是该对象被GC之后所能回收到内存的总和
一般来说,Shallow Heap堆中的对象是它的大小和保留内存大小相同的对象是堆内存的数量时,将释放对象被垃圾收集。保留设置一组主要的对象,例如一个特定类的所有对象,或所有对象的一个特定的类装入器装入的类或者
只是一群任意对象,是释放的组对象如果所有对象的主要设置变得难以接近的。保留设置包括这些对象以及所有其他对象只能通过这些对象。保留大小是总堆大小中包含的所有对象的保留。可使用工具提供的regex正则搜
索一下自己的类,排序后看看哪些相对是占用比较大的。
dominetor_tree
可以看出来beans占用比较多内存。
Top_consumers_html
可以看出来那些包引用哪些类占用较多内存。
Leak_Suspects
自动分析最可能出现内存问题的类是:java.beans.ThreadGroupContext,由类加载器:<system class loader>,加载实例:java.util.WeakHashMap$Entry,占用8,643,712 (11.69%)字节。
当然在分析过程中最好过滤掉弱引用分析更准确。
辅 助 脚 本
当内存使用出现紧张的时候就需要考虑分析原因了,为监控内存使用情况,写了一个小脚本,实时的打印内存剩余情况,执行如下(省略):
同时也可利用jvm回收原理,利用jdk自带工具监控,当两个存活区不存在一个为空闲的时候说明内存是不够的,此时可分析堆栈信息,如下所示(s1和s0都不为0.00):
其他工具,如:nmon文件。这个文件可实时监控虚拟机cpu、内存、磁盘等使用情况,命令行监控生成文件,导入nmon分析工具即可。监控过程略。
总 结
结合脚本及其他工具分析判断内存泄露或者内存溢出,进行分析可能存在内存问题的类或者对象或者对jvm空间配置进行调整。本次确定了监控的主要步骤分析工具如下:
1、利用脚本、工具监控内存使用情况
2、对内存报错outofmemory或者内存1飙升存在可能风险的点保留dump镜像
3、导入mat工具分析定位最可能有问题的对象
安装:环境JDK1.8+eclipse4.5+mat插件(也可使用mat单独运行软件压缩包如下)
安装过程参考:https://yq.aliyun.com/ziliao/422140