网上查看总结,侵删。
内存泄露,内存溢出(OOM), GC概念
- GC;
而GC回收则会定时扫描内存,发现不被引用的对象即可回收。 - 内存泄露;
正常来说你的app堆内存会有升有降。此时如果有某个Activity持有某个引用,在onDestroy时还不把这个引用设为null,那么返回进入退出这个界面,Activity就会创建很多次从而存在多个实例,导致堆内存直升不降!这就叫做内存泄漏。 - 内存溢出
当用户重复这个操作或者有多个不同Activity内存泄漏时,app运行一段时间堆内存超过系统规定的最大值 heapSize,杯子满了就会发现内存溢出(OOM),app崩溃。
内存泄露关键点
- app上限值heapSize是多少
- 什么情况导致无法GC
- 怎么复现是哪个界面内存泄漏
复现
用AndroidStudio自带的内存分析工具分析,点击Dump Java Heap,生成当前时间点的 .hprof格式文件;
activity 有多个实例化对象,足以证明它有内存泄漏。看里面的关键对象,是否有泄露,排除.
内存泄露定位
复现场景或者知道哪里有泄露,使用leakcanary
内存泄露常见场景
内部类请使用static,因为非静态内部类默认持有外部类的引用,比如在Activity里面直接放一个自定义的Adapter
静态类(比如Application,单例类,其他static类)请不要持有Activity引用,因为静态类生命周期比Activity长。
解决办法:在需要的地方用BaseApplication.getTopActivity。或者Activity作为弱引用传入
注意Handler会默认持有当前Activity,用的时候最好不要直接new Handler().post(new Runnable...),除非你确定这个runnable会在Activity销毁前执行完