上图为 DDMS中的标签Heap,讲解如下:
打开DDMS界面,在左侧面板中选择你要观察的应用程序进程,然后点击Update Heap按钮,接着在右侧面板中点击Heap标签,之后不停地点击Cause GC按钮来实时地观察应用程序内存的使用情况即可。
继续操作我们的应用程序,然后继续点击Cause GC按钮,如果你发现反复操作某一功能会导致应用程序内存持续增高而不会下降的话,那么就说明这里很有可能发生内存泄漏了。
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掉。总之,使用DDMS的Heap视图工具可以很方便的确认我们的程序是否存在内存泄漏的可能性,能够大致定位可能泄露的操作范围。
上图为 DDMS中的标签Allocation Tracker,讲解如下:
- 显示当前内存分配的详细情况,可以看到每种数据类型(基本数据类型或者自定义类)的内存分配大小,甚至可以看到是哪个源代码文件的哪一行代码分配出去的。