其实主要是内存方面,内存管理是个永恒的话题!
1.从工具DDMS中,在Sysinfo的tab栏里面有一个Memory usage的选项,通过USB连接Android设备以后很容易抓到图。
在图中可以看到系统随时可以用的内存是Free和Buffers两项,因为我抓图的系统只有128M的内存,所以看上去这部分可用内存已经很少了。
2.通过Linux的/proc文件系统的meminfo来分析这个系统的内存使用情况更客观。之所以这么说,是因为通过这种方法可以绕开繁琐的dalvik实现机制,以系统的层面来分析:
C:\Users\Administrator>adb shell
shell@android:/ $ cat /proc/meminfo
cat /proc/meminfo
MemTotal: 999008 kB
MemFree: 157532 kB
Buffers: 41308 kB
Cached: 319584 kB
SwapCached: 0 kB
Active: 488128 kB
Inactive: 167012 kB
Active(anon): 292356 kB
Inactive(anon): 3544 kB
Active(file): 195772 kB
Inactive(file): 163468 kB
Unevictable: 1520 kB
Mlocked: 13684 kB
HighTotal: 529408 kB
HighFree: 61680 kB
LowTotal: 469600 kB
LowFree: 95852 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 295816 kB
Mapped: 165768 kB
Shmem: 360 kB
Slab: 27752 kB
SReclaimable: 9524 kB
SUnreclaim: 18228 kB
KernelStack: 8232 kB
PageTables: 9628 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 499504 kB
Committed_AS: 5690380 kB
VmallocTotal: 540672 kB
VmallocUsed: 139020 kB
VmallocChunk: 98112 kB
shell@android:/ $
对于Linux系统来说,可以立即使用的内存是 MemFree+Buffers+Cache,
我们从DDMS中拿到的图差很多。或者说Google隐藏了cache,没有给我我想要的东西;Android系统为了加快系统的运行速度会在系统允许的情况下,大量的使用内存作为应用程序的cache。而当系统内存紧张的时候,会首先释放cache的内存,
3、Android内存介绍: test.add(img);
}
}
});
其中test为静态的List<ImageView>。这样,如果一直点击btn就会出现内存泄漏的情形。
我们如何去监测内存泄漏呢?
以上面内存泄漏的例子为测试Activity,当点击按钮后,会向一个静态数组中添加图片,这样就形成了一个内存泄漏的场景。
进入测试Activity,在点击按钮前先记录当前APP所占用的内存,然后点击按钮。等待操作执行完成后,进行一次GC,再查看APP所占用的内存。
返回后APP所占用的内存没有明显的回落,表明在代码中可能存在内存泄漏的情况发生。
即:在执行某种操作后进行一次GC,内存没有明显的回落。此时即可以断定代码中可能存在内存泄漏。
检测方法:
通过上文所用的三种方法去查看内存的使用情况
使用DDMS中的Heap:
1) 打开DDMS并打开Devices视图和Heap视图
2) 点击选择要监控的进程
3) 选中Devices视图界面上的”update heap” 图标
4) 点击Heap视图中的”Cause GC” 按钮(相当于进行了一次GC的操作)
一般我们会观察Data Object的Total值,正常情况下在每次GC后,这个值都会有明显的回落并会稳定在一个范围之内,说明代码中没有未被释放的内存;若这个值在每次GC后没有出现明显的回落,则说明代码中可能存在没有被释放的内存。
总述:内存不仅是性能测试时需要关注的,作为优秀的开发工程师更应该关注自己的代码内存占用的情况,这样可以尽量避免OOM的情况发生。要知道手机分配给每个进程的内存并不多,当系统内存不够的时候会kill掉一些占内存高的进程,所以为了不被系统kill掉我们要尽可能的合理使用内存避免内存泄漏的情况发生。
(其他的可以看这个 http://blog.csdn.net/innost/article/details/9008691 )