2)各种资源的释放:
包括cursor的关闭,IO流的关闭,bitmap的回收等,进行一些带有缓存的资源一定要关闭或者释放。
3)Handler的泄露:
调用handler的delay的时候,会被认为对象是有用的,导致无法回收,还有handler开启线程去下载东西没有下载完成的时候,也会因为线程导致无法回收activity;或者使用handlerThread的时候,有延迟的方法,都会导致无法回收。其主要原因在于handler是持有activity的引用,主线程不是自带一个Looper然后给handler用,导致有关联关系。
4)各种注册引用方法:
比如一个常驻的后台线程处理某些时间,把当前对象注册,因为一直持有对象引用,导致这个activity一直保留,所以不用的时候需要反注册。
5)把对象缓存进容器内却忘记remove掉:
有时候为了加快页面响应,结果缓存一些对象到容器内,结果越加越多,然后挂掉。
四、 系统级别的内存管理
1)LMK机制和oom_adj的值
Android内核有个专用的驱动low-memory-kill,当系统级别的内存不够的时候会根据oom_adj的值以及内存分配状况去kill掉某个进程,oom_adj可以在/proc/[pid]/oom_adj看到,并且这个值会随着进程的状态改变而改变,比如系统进程一般是-16,越大越容易被干掉。
2)5个进程的优先级
前台进程:当前运行的,基本不死 ;
可见进程:界面可以见到,比如被遮挡 ;
服务进程:进程带后台服务的,比如播放器 ;
后台进程:点击home键,但不退出,就是后台进程了,有比较大几率会被杀;
空进程:退出应用程序,还在后台保留这空