内存泄露

作者: 黑色海鸥 | 来源:发表于2018-04-14 18:21 被阅读21次

    网上查看总结,侵删。

    来自:
    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销毁前执行完

    相关文章

      网友评论

        本文标题:内存泄露

        本文链接:https://www.haomeiwen.com/subject/cljlkftx.html