MAT分析Android内存dump文件的两个tips
查看Android memory dump文件中的Bitmap
在Android应用开发时一般使用Eclipse Memory Analyzer(MAT)分析堆内存占用情况,而Bitmap一般是占用内存最大的对象,所以有时我们希望知道MAT工具中显示的Bitmap对象对应哪个图像(本地资源文件或网络下载)。
在MAT中选定要查看的Bitmap,如下图所示,在Inspector窗口查看Bitmap对象的Attributes,其中mBuffer为Bitmap像素数据,mHeight和mWidth为Bitmap的高度和宽度。右键mBuffer并在弹出的菜单中选择”Copy”->”Save Value To File”,将这个array的值保存到文件中,并用.data作为扩展名。
对于Linux用户,可以使用GIMP或ImageMagick工具将原始数据转换成png格式图像。方法如下:
- 使用GIMP软件:打开GIMP,”File”->”Open”,选择刚才保存的.data文件,弹出”Load Image from Raw Data”对话框,设置合适的参数,设置”Image type”为“RGB Alpha”(大部分android resource是这种image type,若有其它格式,还要尝试其它的类型),设置width和height为mWidth和mHeight的值。这样GIMP界面就会显示出图片了。
- 使用ImageMagick工具:将导出的.data文件扩展名改为.rgba
|
|
对于Windows或MAC用户,可以使用Photoshop将原始数据转换成png格式图像。方法如下:
- 将导出的.data文件扩展名改为.raw。“文件”->“打开”,选择文件格式“Camera Raw”,设置宽度和高度,将通道数设为4。这样Photoshop界面就会显示出图片了。
查看dump文件中unreachable的对象
一个Java对象没有引用后,该对象占的堆内存不是立即被回收的,回收的时机是JAVA虚拟机的GC算法来决定的,所以memory dump时产成的文件中会包含unreachable的对象。一般来说,如果MAT工具中看到的live对象的总大小比dump文件大小小很多,我们有必要查看一下哪些unreachable的对象占用了内存。MAT默认情况下在分析dump文件时会将unreachable的对象剔除,可以通过打开如下设置让MAT分析dump文件时保留unreachable对象:”Window”->”Preference”->”General configration for memory analyzer”->”keep unreachable objects”。
参考
http://stackoverflow.com/questions/12709603/mat-eclipse-memory-analyzer-how-to-view-bitmaps-from-memory-dump
https://wiki.eclipse.org/MemoryAnalyzer/FAQ#How_to_analyse_unreachable_objects