DDMS中自带的Heap工具能够显示出当前堆内存的状况,分配内存、剩余的内存等信息。android
首先是进入DDMS,运行应用,在DDMS的左边区域选中应用的包名,而后点击上方的update heap图标。eclipse
点击后控制台就会被触发了,但如今控制台可能没有下面的信息,由于只有在GC后控制台才会真正触发。因此能够点击Cause GC按钮,而后就能够看到下面的信息了。工具
说明:当内存使用信息第一次显示之后,无须再不断的点击“Cause GC”,Heap视图界面会定时刷新,在对应用的不断的操做过程当中就能够看到内存使用的变化插件
这些数据包括当前的数据对象个数,类对象个数,咱们主要关注的是最上面的那个汇总栏(有ID的那个表格),还有下面的data object(数据对象,也就是咱们的程序中大量存在的类类型的对象)。对象
在data object一行中有一列是“Total Size”,其值就是当前进程中全部Java数据对象的内存总量,通常状况下这个值的大小决定了是否会有内存泄漏。能够这样判断:blog
a) 不断的操做当前应用,同时注意观察data object的Total Size值;进程
b) 正常状况下Total Size值都会稳定在一个有限的范围内,也就是说因为程序中的的代码良好,没有形成对象不被垃圾回收的状况,因此说虽然咱们不断的操做会不断的生成不少对象,图片
而在虚拟机不断的进行GC的过程当中,这些对象都被回收了,内存占用量会会落到一个稳定的水平;ip
c) 反之,若是代码中存在没有释放对象引用的状况,则data object的Total Size值在每次GC后不会有明显的回落,随着操做次数的增多Total Size的值会愈来愈大, 内存
直到到达一个上限后致使进程被Kill掉,这就是咱们不但愿的!
下面是一个例子,经过不断滑动照片墙来加载新的图片,从下面的动态图能够看见,当旧的图片被移出屏幕的时候引用了GC,占用的内存有明显的回落,接着开始上升(由于又加载了新的图片),但上升到必定程度便不会继续升高,这就说明这个程序不会不断的产生大量的对象,不太会出现OOM。
另外还可使用heap dump来追踪内存信息。点击DDMS工具条上面的Dump HPROF文件按钮,选择文件存储位置(默认选择:D:\tools\android-sdk\tools)
这个由DDMS生成的文件不能直接用MAT工具打开,会提示文件格式不支持。须要转化:
(1)运行cmd,cd 到 D:\tools\android-sdk\tools目录下
(2)输入命令hprof-conv xxxxold.hprof yyyynew.hprof xxxx.hprof 为原文件,yyyy.hprof 为转化事后的文件(一样生成在D:\tools\android-sdk\tools目录下)
备注:
若是使用ADT(它包含DDMS的插件)同时也在eclipse里面安装了MAT,点击“dump HPROF”按钮将会自动地作转换(用hprof-conv),同时会在eclipse里面打开转换后的hprof文件(它其实用MAT打开)。