内存分析工具MAT的使用
MAT下载地址
http://www.eclipse.org/mat/downloads.php
我使用的是mac,这里选择Mac OSX版本下载
启动MAT
导入dump文件
导入一个1.58G的dump文件报错"Java heap space"
解决方式:
编辑文件MemoryAnalyzer.ini
修改最大堆内存为4G,-Xmx4g
重新启动MAT,导入dump文件
打开Leak Suspects视图,分析内存使用情况
可以看到(a) Problem Suspect 1占用了550.5MB内存,应该就是我们要关注的内存溢出点。
点击Details可以看到详情
从以上结果分析可以看到是S2RegionCoverer$QueueEntry
对象占用了很大的heap内存空间
点击tree视图模式查看
可以看到线程地址为0xc44bb0f0
,0xc6be9430
的两个线程分别占据了54.48%,33.65%的heap内存空间。
在第一行输入问题线程id: 0xc44bb0f0 进行查询,进入找到累积点(堆占据最大)
可以看到累积了562,397
个S2RegionCoverer
对象,这就是内存溢出的根源
点击Problem Suspect 1的stacktrace,找出代码所在位置
可以看到问题代码可能是在S2GeometryUtils的138行