AndroidOOM一直是个很重要需要解决的问题.
出现原因
内存泄露 Memory leak 申请的内存在使用完后无法正确释放,如果持续出现会产生大量泄露.Android虚拟机运行的内存是有限的,如果泄露太多,在后续程序再次申请内存时候无法提供足够的空间使用,于是就产生了内存溢出 Out of Memory.
为什么会出现泄露问题?
垃圾回收机制有关了
栈中存放基础类型和对象引用
堆中存放new创建的对象和数组
GC自动清空清空堆中不再使用的对象,java是通过对象引用来使用的,如果没有引用指向堆中的对象.那么这样的对象就是不可到达对象,在每次GC工作时候都会处理,那么问题来了,如果一个对象的引用一直存在栈中,那么垃圾回收机制不可能去清空堆中的对象,但是很多时候,是因为错误的原因,保留了不需要的引用,白白浪费了控件.
具体解决涉及到部分很多,逐步解决,具体几个方法如下
解决方案
1.永远的Singleton
单例是静态的所以生命周期和app一样长,如果讲一个activity的context传入到单例中,这个activity就不会被回收了.
解决方法,单例中使用application的context就可.
2.Handler错误的使用
Handler和Activity生命周期不一致.如果Handler发生了一个Message还没有被处理(例如发送一个延时100s的但是Activity马上finish了)Message一直存在MessageQueue一直存在,持有当前Activity的引用导致不能回收,最简单就是Destory时候移除消息队列中的消息
3.集合清空
一些对象引用存放在集合中,应该在Destory的时候clear(),然后置null
4.Bitmap低下
不用的时候代用Recycle()
使用弱引用选择适当的分辨率和大小的图片
如果不影响体验,可以降低图片的精度
5.创建和关闭没有成对出现,例如开启资源,打开webview,都需要在不需要时候手动销毁
6.设计模式的问题,a持有b,b持有c,c持有a那么是永远不能释放的.
本文详细探讨了Android应用中常见的内存溢出问题(OOM),解释了内存泄露的原因及其与垃圾回收机制的关系,并提供了多种有效避免内存泄露的方法,包括合理使用单例模式、正确管理Handler消息队列、及时清理集合中的对象引用等。
1401

被折叠的 条评论
为什么被折叠?



