android 内存泄露:
===========================
程序申请一块内存,但没有指针指向这块内存,内存就不能使用被泄露
dalvik虚拟机内存堆大小一般为16M,最大24M,超出则outOfMemory。
如果长时间保持大资源文件context的引用或者保存了多个耗用内存过大的资源(bitmap等),就容易造成内存泄露;
android内存回收:
===========================
基于java的内存回收机制,有向图,如果从根节点开始找不到对象,对象的引用计数器为0,就回收内存;
====创建====可达状态=====
失去 || ||重新
引用 || ||引用
||
=====可恢复状态======
彻底 | 失去
引 | 用
=====不可达状态====
|
| =========
|————||垃圾回收
==========
1.回收实现细节
如果考虑到磁盘碎片:Compacting算法的收集器的实现中,一般增加句柄和句柄表。(先将对象移动到堆的一端,重新刷新对象的引用)
stop-and-copy算法:它将堆分成对象面和空闲区域面,在对象面与空闲区域面的切换过程中,程序暂停执行,克服句柄的开销和解决堆碎片的垃圾回收。
2.避免内存泄露
对象不使用时即时free;
图片缩放过程中常常占用比自身大的内存,易泄露;
一个对象在多处被引用时只有一处free是会回收失败的;
大资源文件的引用特别要注意不要同时引用多个;
查询数据库后没有关闭游标cursor ,尽可能的将一些静态的对象(尤其是集合对象),放于SQLite数据库中,要尽量使用sql语句来处理;
注意static关键字定义的变量引用的对象,注意变量的生命周期;
3.内存泄露的调试方法
1. 通过DDMS中的heap工具,生成hprof文件去发现是否有内存溢出
2. 通过内存分析工具 MAT(Memory Analyzer Tool),找到内存泄露的对象
4.内存泄露分析参考资料:
http://hubingforever.blog.163.com/blog/static/171040579201142010757755/
http://blog.csdn.net/hudashi/article/details/7050892
http://hubingforever.blog.163.com/blog/static/17104057920113252542215/