android应用开发详解(五)--------------内存泄露的检测

来源:互联网 发布:linux 命令 帮助 编辑:程序博客网 时间:2024/04/29 11:38

生活总是让我们遍体鳞伤,但是到后来,那些受伤的地方总是会变成我们最强壮的地方。


1、安装MAT插件

eclipse---->help-------->install new software,work with 选择最后一项Juno - http://download.eclipse.org/releases/juno,在展开的列表中选择“General purpose tools”中选中“Memory Analyzer”和“Memory Analyzer(Charts[option])”,next,等待。


2、关于adb的默认端口5037被占用的问题

安装完之后,我的devices窗口中只显示设备online,不显示各种进程。下面是解决方法:

 先说两条命令,在命令行执行:netstat -aon|findstr "5037"查看5037被谁侦听;tasklist|findstr " 刚才侦听到的端口号"  查看谁在使用端口号5037,

我原来的adb端口号5037是被360MobileMgr.exe占用,于是下了个豌豆荚(听说豌豆荚可以提前为adb先占用了5037端口),端口被占用的问题依然没解决。

又遇到了新的问题,我的测试手机是红米,需要最新的驱动,于是下了个xiaomi_drv_70000_32.exe,放在电脑文件夹xiaomi_usb_driverxia .在“运行”中输入devmgmt.msc,打开设备管理器,找到android 设备,右键--->更改......,重启电脑。ok!手机可以连接上豌豆荚了。


3、关于adb不是内部命令

adb.exe在\sdk\platform-tools下,将此路径添加到环境变量中,就ok了。


4、MAT 文件的生成及分析

首先,连接上设备,在devices窗口中会显示设备名称,下面显示进程,选中一个进程,点击此窗口右上角的update heap,然后点击dump HPROF file,eclipse会自动打开此按钮生成的文件。





这是第一步,下面 看第二步:分析哪里内存泄露了,点击“leak suspect”




然后点击“details”,查看详情。




android.content.res.resource内存占据31%。

第三步:

左键点击Class Name中的条目,即上面深蓝色条目,list Objects----->with incoming reference,打开下图:


前面有圆点的就是内存泄露的地方。

第四步:分析你的代码

【问题】:走到这里,我走不下去了,我不会分析代码哪里出错了,看上面的图片是资源文件有问题,继续查找吧。整个流程应该没错,有错误的话请大家指出来,共同学习,谢谢。


5、观察内存泄露

在Heap视图中就会看到当前选中的进程的内存使用量的详细情况。
a) 点击“Cause GC”按钮相当于向虚拟机请求了一次gc操作;
b) 当内存使用信息第一次显示以后,无须再不断的点击“Cause GC”,Heap视图界面会定时刷新,在对应用的不断的操作过程中就可以看到内存使用的变化;
c) 内存使用信息的各项参数根据名称即可知道其意思,在此不再赘述。
如何才能知道我们的程序是否有内存泄漏的可能性呢。这里需要注意一个值:Heap视图中部有一个Type叫做data object,即数据对象,也就是我们的程序中大量存在的类类型的对象。在data object一行中有一列是“Total Size”,其值就是当前进程中所有Java数据对象的内存总量,一般情况下,这个值的大小决定了是否会有内存泄漏。可以这样判断:
a) 不断的操作当前应用,同时注意观察data object的Total Size值;
b) 正常情况下Total Size值都会稳定在一个有限的范围内,也就是说由于程序中的的代码良好,没有造成对象不被垃圾回收的情况,所以说虽然我们不断的操作会不断的生成很多对 象,而在虚拟机不断的进行GC的过程中,这些对象都被回收了,内存占用量会会落到一个稳定的水平;
c) 反之如果代码中存在没有释放对象引用的情况,则data object的Total Size值在每次GC后不会有明显的回落,随着操作次数的增多Total Size的值会越来越大,
直到到达一个上限后导致进程被kill掉。
d) 此处已system_process进程为例,在我的测试环境中system_process进程所占用的内存的data object的Total Size正常情况下会稳定在2.2~2.8之间,而当其值超过3.55后进程就会被kill。


6、shallow-heap和retained-heap

Shallow size就是对象本身占用内存的大小,不包含对其他对象的引用,也就是对象头加成员变量(不是成员变量的值)的总和。在32位系统上,对象头占用8字节,int占用4字节,不管成员变量(对象或数组)是否引用了其他对象(实例)或者赋值为null它始终占用4字节。

Retained size是该对象自己的shallow size,加上从该对象能直接或间接访问到对象的shallow size之和。换句话说,retained size是该对象被GC之后所能回收到内存的总和。




0 0