避免内存泄露:将对方放入到全局变量
适时释放内存:比如生命周期回调函数
Android如何管理内存?
1.Anroid不用swap memory,用paging和memory-mapping
所有被修改过的内存都必须常驻内存,且不能被paged out.所以要适时释放所有引用的内存。
但是没有修改过的文件,可以被page out of RAM
2.共享内存
Android尝试通过如下方式在进程间共享RAM
1)所有app进程从Zygote Fork 出来。Zygote在系统启动时启动并加载框架代码和资源.
这样可以在各应用进程间共享框架的代码和资源
2) 多数的static data被mmapped到process.这样可以在进程间共享,需要时也可以paged out.
static data包括:Dalvik code(放在.odex文件中并直接mmapping),app资源和传统项目元素(比如*.so)
3)进程间的动态内存(用ashmem or gralloc显示分配共享内存)
3.分配和回收内存
1)每个进程的Dalvik heap被限定在单一地虚拟内存范围。该值定义logical heap size,可以按照需要增加,
但是不会超出系统给每个进程定义的限制值。
2)heap的logical size和heap占用的实际物理内存不一样。统计app heap时,Android计算PSS,会将进程间共享
的dirty和clean pages均分。PSS的总和可以作为物理内存的footprint.
3)Dalvik heap不影响logical heap的大小,也就是说Android不会整理Dalvik heap。
只有当logical heap的末尾有未用的空间时,Android会收缩logical heap size。
单不代表heap占用的物理内存不会被回收。在垃圾回收过后,Dalvik从heap查找未用的pages返回给内核。
所以,配对使用分配和释放大量内存可以引起几乎所有使用过的物理内存被回收。但是小内存却没有这个作用,
因为同一内存page可能被其它被引用的内存对象共享。
4.限制APP memory
Android给每个APP设置了一个heap size的极限值,当APP达到极限值后会出现outofmemoryError.
可以通过getMemoryClass()来确定还有多少heap空间可以申请。
5.APP如何管理内存?
app切换时,old app仍然被缓存在内存中。可以通过如下方式是内存使用更高效:
1)保守地使用Services
如果需要运行service完成后台工作,不要一直运行服务除非显示地完成一个任务。
同时服务完成工作时,一定要确保服务被停掉。
当启动一个服务时,系统将保持相应进程一直运行,这样这个服务就会一直占据内存。也就相应
减少系统缓冲应用的数目,让app切换可能更慢。在系统内存非常紧张以至于无法运行所有running
的服务时,系统将崩溃。最好的方法就是使用IntentService启动服务,完成任务后自动退出。
让一个不需要的服务一直运行,是最严重的内存管理错误。
2)在界面隐藏时释放内存
3)在收到内存紧张的消息时释放内存
4)避免用bitmaps浪费内存
5)使用优化过的数据容器
6)注意内存过热
7)注意使用抽象
8)注意使用外部库
9)使用proguard工具优化代码
10)使用zipalign优化apk
11)分析RAM使用
12)将app的模块分为多个进程。
扩展阅读:
Running in a Background Service .
Best Practices for Performance.