今天我们来一起学习一下如何利用MAT(Memory Analyzer Tool)快速的定位Java程序的内存泄漏问题。本文实验环境为Mac下安装独立版的MAT。
我们先来学习MAT:
Eclipse Memory Analyzer 是一款快速且功能丰富的Java 堆分析器,可帮助您查找内存泄漏并减少内存消耗。使用内存分析器分析包含数亿对象的高效堆转储并快速计算对象保留大小。请参阅。任何阻止垃圾收集器收集对象的人都可以运行报告来自动提取可疑的泄漏。 Eclipse Memory Analyzer 是一个快速且功能丰富的Java 堆分析工具,旨在查找内存泄漏并减少内存消耗。
使用MAT 分析产生数亿个对象的堆转储文件,快速计算幸存对象的大小,发现谁阻止对象被GC 回收,并创建自动提取可疑对象的报告。
翻译比较生涩,所以英文不好的同学还是看英文吧~
安装独立版本的MAT
官网下载Memory Analyzer 1.9.0 release,下载地址:
https://www.eclipse.org/mat/downloads.php
MAT官网下载
下载并解压zip包后,双击即可运行该应用程序的欢迎页面。
MAT 欢迎页面
单击如何进行堆转储将打开本地MAT 文档。
MAT 帮助文档
Java 堆转储分析工具现已安装。接下来,在本地创建一个转储文件来尝试如何使用该工具。
本地获取Heap Dump文件
创建一个简单的类并运行它以获取堆转储文件。
TestMemortLeak.java
设置启动参数。
-Xms128m -Xmx256m -XX:MaxPermSize=256m
-XX:+内存不足错误时的堆转储
-XX:HeapDumpPath=/用户/edz/testMemoryLeak
当我运行main方法时,报如下错误:
进行堆转储
获取Java 堆转储文件并开始分析。
MAT分析Java Heap Dump文件
MAT 打开本地转储文件并选择泄漏可疑报告:
泄漏嫌疑报告
转储文件分析结果摘要
通过看上图你基本上能看出问题所在吗?我已经清楚地告诉你我怀疑的问题是什么:(a)235.6M。它消耗由配置的启动参数分配的所有内存。
点击黄色区域“See stack Trace”可以查看堆栈信息。
堆栈跟踪
您可以快速找到程序中存在内存泄漏问题的代码。
以上只是一个实验,但是如果在生产环境中怀疑自己的线上业务存在内存泄漏该怎么办?请注意,您将需要获取Java 堆转储文件,但此时您需要保留场景才能获取转储文件。否则,重新启动或等待完整GC后,该场景将消失。
接下来,我将向您展示如何通过Jmap获取Java堆转储文件。
jmap -h
jmap -h 查看如何在Linux 上使用jmap 命令。这里我们不会详细解释每个参数。首先,查看当前运行的Java程序的进程ID。
jps、ps -ef|grep java、ps -ef|grep 项目名都是允许的。
接下来,获取转储文件。
jmap -dump:live,格式=b,文件=dump.phrof 31824
使用上述命令时,请务必在启动应用程序时使用参数形式指定参数,因为如果服务器上的JVM 堆太大,应用程序可能会“Stop the World”。这使得当应用程序“Stops the World”和内存溢出时,线程转储文件能够被及时保存。
将服务器上的dump.phrof文件下载到本地电脑,在MAT中打开即可开始分析~
以上就是本次和大家一起学习的MAT分析Java Heap Dump实践之旅了,希望对大家Java的学习成长之路有一定的帮助。我会持续分析Java领域相关技术文章,欢迎大家留言、关注,一起交流学习,共同成长!
版权声明:本文转载于今日头条,版权归作者所有。如有侵权,请联系本站编辑删除。