一、开发环境:
操作系统:ubuntu 1 4. 04
IDE:面向Web开发人员的Eclipse Java EE IDE。版本:Luna Service Release 2(4. 4. 2)
JDK版本:1. 7. 0_80
MAT版本:1. 5. 0
二、事件的原因
最近,通过公司的哨兵监控系统,我发现我的项目的内存使用量每天都在增加,如下图所示。对于稳定运行的Java项目,这种情况通常可能是内存泄漏。

三、使用MAT检查内存泄漏3. 1安装MAT
MAT有两种安装方法,与其他eclipse插件略有不同。
一种安装方法是将MAT作为eclipse的插件安装:启动Eclipse->帮助-> Eclipse Marketplace,然后搜索Memory Analyzer,安装并重新启动Eclipse。
另一种安装方法是将MAT作为单独的软件安装:转到官方网站并根据操作系统版本下载最新的MAT。下载后,将其解压缩以运行。

我正在使用MAT 1. 5 Linux x64版本。不同版本的MAT可能具有不同的按钮位置或功能。
3. 2修改MAT配置
解压缩MAT软件版本后,目录中有一个MemoryAnalyzer.ini文件。文件中有一个Xmx参数。此参数指示最大内存使用量。默认值为1024m。您可以根据堆转储文件的大小来修改此参数。
1. MemoryAnalyzer.ini中的参数通常默认为-vmargs- Xmx1024m,足够了。如果计算机的内存不大,则增加此参数的值将导致MemoryAnalyzer报告错误:无法创建Java虚拟机。
2.当导出的转储文件的大小大于配置的1024m(在注1中,提到的配置:-vmargs-Xmx1024m)时,当MAT输出分析报告时,它将报告一个错误:发生内部错误:“从XXX解析堆转储”。适当调整注1中的参数。
3. 3获取堆转储文件
我尝试了两种获取堆转储文件的方法
第一种方法是使用jamp获取。对于服务器上部署的程序,可以使用此方法。获取堆转储文件后,将scp到本地,然后在本地对其进行分析。 get命令是:
[普通]
jmap-dump:format = b,file =
以这种方式获得的堆转储文件只能在MAT软件中打开,并且在安装了插件的情况下没有相应的Eclipse打开选项。
另一种方法是在Eclipse中安装Mat插件,运行程序,文件->新建->其他->堆转储->接下来,选择相应的过程,然后完成。如果不进行深入研究,此方法似乎可以很好地用于远程服务器上的程序。以这种方式获取堆转储文件后,默认情况下会打开eclipse。如下图所示,选择“泄漏可疑报告”并单击“完成”以进入MAT分析页面的主页。

3. 4堆转储文件分析
在实际操作中,我使用jmap获取堆转储文件,然后将其scp到本地,然后由MAT软件加载。
加载后,首页如下图所示。主页上最有用的是直方图和可疑泄漏。

单击Leak Suspects将在与堆转储文件相同的目录中生成Leak Suspects.zip文件,并且还将从主页跳转到Leak Suspects页面。

解压缩文件后,您可以通过浏览器打开分析结果。

以下是“泄漏嫌疑人”页面



在“可疑泄漏”页面中,将给出可能的内存泄漏。如上图所示,可能发生三种内存泄漏,但是只有第一个在我的程序中,而另外两个在jar包或jdk中。可以,不用担心。
单击“详细信息”以进入详细信息页面。在详细信息页面中,“到累积点的最短路径”表示从GC根目录到内存消耗累积点的最短路径。如果内存消耗累积点具有到GC根的路径,则该内存消耗累积点将不会作为垃圾回收。

此对象中存储的所有内容均在“按类别分类的所有累积对象”中列出。

为了查找内存泄漏,我获得了两个堆转储文件,并且两个文件之间的时间间隔是一天(因为内存仅略有增加,所以很难在短时间内找到问题)。比较这两个文件的对象,可以通过比较结果轻松定位内存泄漏。
MAT同时打开两个堆转储文件,并分别打开直方图,如下图所示。在下图中,方框1按钮用于比较两个直方图。比较之后,在方框2中选择“分组依据包”,然后比较每个对象的更改。不难发现,相比于堆6. hprof,heap 3. hprof具有64个eventInfo对象。如果您熟悉代码,那么这样的结果必须能够给程序员一些启发。我还根据这种差异找到了最终内存泄漏的位置。

我的内存泄漏的位置是一个列表。此列表仅继续向其中添加eventInfo对象,但尚未发布。
修改后的代码:

本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-359692-1.html
有十万的人根本不在乎那100元
娃哈哈哈哈
请教授下课吧
俄国重心在欧洲所以放弃在华利益