Android内存优化总结--内存泄漏与OOM

2021-05-30  本文已影响0人  码农ing

记录分享一下周末的学习总结---Android内存优化,总结后续还会完善补充。


内存优化分为:一个本质和三个知识点

本质:对象的引用未被释放,导致对象本身无法被有效的回收。

三个知识点:内存泄漏、内存溢出、内存优化工具

【内存泄漏】

1.单例模式引发的内存泄漏:

原因:单例模式里的静态实例持有对象的引用,导致对象无法被回收,常见为持有Activity的引用

优化:改为持有Application的引用,或者不持有使用的时候传递。

2.集合操作不当引发的内存泄漏:

原因:集合只增不减

优化:有对应的删除或卸载操作

3.线程的操作不当引发的内存泄漏:

原因:线程持有对象的引用在后台执行,与对象的生命周期不一致

优化:静态实例+弱引用(Weakrefrence)方式,使其生命周期一致

4.匿名内部类/非静态内部类操作不当引发的内存泄漏:

原因:内部类持有对象引用,导致无法释放,比如各种回调

优化:保持生命周期一致,改为静态实例+对象的弱引用方式(WeakReference)

5.常用的资源未关闭回收引发的内存泄漏:

原因:BraodcastReceiver,File,Cursor,IO流,Bitmap等资源使用未关闭

优化:使用后有对应的关闭和卸载机制

6.Handler使用不当造成的内存泄漏:

原因:Handler持有Activity的引用,其发送的Message中持有Handler的引用,当队列处理Message的时间过长会导致Handler无法被回收

优化:静态实例+弱引用(Weakrefrence)方式

销毁对象时候清空队列里的Message

【内存溢出】

原因:

1.内存泄漏长时间的积累

2.业务操作使用超大内存

优化:

1.调整图像大小后再放入内存、及时回收

2.不要过多的创建静态变量

【优化工具】

LeakCanary(Activity内存泄漏)

Profiler(内存泄漏、内存抖动、应用卡顿等)

上一篇下一篇

猜你喜欢

热点阅读