background image

Andriod 知识汇总(三)

使用 DDMS Heap 进行内存泄露调试

 

内存监测工具 DDMS --> Heap 
这里我使用 eclipse 的 ADT

 

插件,并以真机为例,在模拟器中的情况类似。用 Heap 监测应

 

用进程使用内存情况的步骤如下:
1. 启动 eclipse 后,切换到 DDMS 透视图,并确认 Devices 视图、Heap

 

视图都是打开的;

2. 将手机通过 USB

链接至电脑,链接时需要确认手机是处于 USB

调试 模式,而不是作

为 Mass Storage”  

3. 链接成功后,在 DDMS 的 Devices 视图中将会显示手机设备的序列号,以及设备中正

 

在运行的部分进程信息;
4. 点击选中想要监测的进程,比如 system_process

 

进程;

5. 点击选中 Devices

视图界面中最上方一排图标中的 Update Heap”

 

图标;

6. 点击 Heap

视图中的 Cause GC”

 

按钮;

7. 此时在 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  

总之,使用 DDMS 的 Heap 视图工具可以很方便的确认我们的程序是否存在内存泄漏的
可能性。

                     找软件资料,就到一览软件文库

http://wk.yl1001.com/rj/