内存泄露

网上查看总结,侵删。

来自:
https://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650242747&idx=1&sn=88c4d040c439c7db13033e5be18440b7&chksm=88638fd4bf1406c25fa75c04c5853281facd65afad24c57797cf1c2fe3719168810a2bdfd8ea&mpshare=1

内存泄露,内存溢出(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销毁前执行完

你可能感兴趣的:(内存泄露)