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 视图工具可以很方便的确认我们的程序是否存在内存泄漏的
可能性。
找软件资料,就到一览软件文库