MAT(内存分析仪工具),基于Eclipse的跨平台内存分析工具,是一种快速且功能性的Java Heap分析工具。它读取运行应用程序时Java生成的环境生成的存储文件快照。它可以帮助我们找到内存泄漏并减少内存消耗。使用内存分析工具来分析许多对象,快速计算内存中对象的大小,查看谁停止了垃圾收集器的回收利用,并可以通过该报告直观地检查结果,从而导致可能导致此结果的结果。
官方网站地址:https://www.eclipse.org/mat/。
内存分析仪可以使用HPROF二进制堆转储文件,IBM系统转储文件(处理后)和IBM Portable Heap Dump S(PHD)文件中的IBM Portable Heap Dump S(PHD)文件。我可以通过内存分析仪直观地在Heap Dump Files中看到:
官方下载地址:https://www.eclipse.org/mat/downloads.php。
下载后,解压缩,您可以看到文件并打开它。
有很多方法可以获取堆转储文件。通常,参数配置是在特定条件下配置的,以触发堆拨盘,也可以通过工具获得。通用命令的方法如下:
我们编写一个简单的代码,该周期创建UUID字符串缝合并将其添加到列表中:
设置启动参数,最大内存为4M,并自动保留堆转储:
运行程序后,迅速抛出了OOM,并自动生成堆转储文件:
默认位置在项目目录下方:
让我们从下面开始分析!
双击文件并打开:
单击文件,打开堆可以选择一个堆转储文件,我们选择刚刚生成的文件。
选择打开模式,我们选择第一个模式,即分析内存泄漏,单击完成以调用堆转储文件:
共同选择的含义:
转储文件越大,打开的时间越长。打开后,概述接口如下。概述视图显示了此转储文件摘要的信息,并显示了一些常用的功能:
让我们看一下其他常见功能。
直方图直方图,用于显示每种类型的实例数,以及浅大小和保留大小:
当您正确地单击任何对象时,您会看到drop -down菜单。如果选择“ ListObjects”菜单项,则可以查看传出参考和传入参考的传出参考。
不通电引用是指当前对象的对象,即传出引用是指当前对象引用的对象。对象的对象保证对象活着以避免被垃圾回收;传出参考显示对象内的特定内容,这有助于我们分析对象的属性。
让我们看一下第一个最大的char []不断参考:
可以看出,它们几乎由字符串对象的值属性引用。实际上,此字符串是我们剪接的UUID字符串。
列出堆转储中活动状态中最大的对象。默认值按保留大小进行排序,因此很容易找到占据最多内存的对象。
排名最大的对象是占据最多内存的对象。树中的子节点是对象直接或间接引用的对象(这意味着将对象回收时将被回收)。
定位OOM时,它是直接主要树的最大对象。在我们的Domina的主导树中,Arraylist占据了最大的内存。这是由OOM引起的。
单击上方的黄色齿轮以生成堆转储文件的线程视图。线程概述以查看线程的操作和抛出的异常分析。
结果在我们的头转储中的线程概述,结果如下。显然,OutofMemoryError被主线程抛出:
MAT分析了堆转储文件并检测到内存泄漏的可能性,例如一个或一组异常的对象。Leak可疑嫌疑人用于生成可疑的内存泄漏分析报告,这非常有用,可以帮助我快速定位OOM。
在我们的堆转储中检查线程概述。结果,如果您不确定OOM的原因,那么您可以直接告诉您:
可以看出,66.79%的内存被对象[]数组占据,因此很可疑。记忆溢出很可能很可能是很可能。单击详细信息以查看详细信息:
您可以看到集合中存储的大量UUID字符串。实际上,已经告诉我们,内存是否溢出。我们可以在详细信息的底部看到:
这是这个大对象(列表设置了数组存储的元素),因为需要连续内存,并且需要内存不足。
在这一点上,分析已完成!