• Android内存泄露


    Android 内存泄漏是一个十分头疼的事情。LeakCanary是一款开源软件,主要作用是检测 Android APP 内存泄露。比起以前的 MAT 工具,LeakCanary 有着十分强大的功能,能够在程序发送内存泄漏的时候提示通知,而且学习成本低。同时提供 log 和 hrpof 日志,便于开发者解决问题。


    1.内存泄露的概念
    垃圾回收器无法回收原本应该被回收的对象,这个对象就引发了内存泄露。

    2.内存泄露的危害
    1)导致用户手机可用内存变少
    2)程序出现卡顿
    3)导致应用莫名退出
    4)应用程序Force Close
    5)用户流失

    3.内存泄露的工具
    1)MAT工具
    2)YourKit工具
    3)LeakCanary工具

    LeakCanary:检测所有的内存泄漏

    没人喜欢OutOfMemoryError

    在Square的注册过程中,我们在bitmap上 绘制了一个用户的签名。这个bitmap和设备的屏幕大小相当,在创建它的时候,我遇到了相当数量的OOM导致的崩溃。

    signature.png

    我们试过了几种方法,没有一个解决了我们的问题:

    • 使用Bitmap.Config.ALPHA_8(签名是不需要颜色的)

    • 捕获OutOfMemoryError,触发垃圾回收然后重试几次(从GCUtils 获得的启发)

    • 我们没有考虑过将bitmap分配在堆内存之外,那个时候Fresco 还没出现。

    我们看待问题的方式是不对的

    bitmap的大小本身不是什么问题。当内存快要满了的时候,OOM随时随地都可能发生。尤其是在创建大对象的时候更容易发生,比如bitmap。OOM一般代表着更深层次的问题:内存泄漏

    什么是内存泄漏?

    有些对象只有有限的生命周期。当它们的任务完成之后,它们将被垃圾回收。如果在对象的生命周期本该结束的时候,这个对象还被一系列的引用,这就会导致内存泄漏。随着泄漏的累积,app将消耗完内存。

    比如,在Activity.onDestroy()被调用之后,view树以及相关的bitmap都应该被垃圾回收。如果一个正在运行的后台线程继续持有这个Activity的引用,那么相关的内存将不会被回收,这最终将导致OutOfMemoryError崩溃。

    寻找内存泄漏

    寻找内存泄漏是一个人工操作的过程,在Raizlabs的 Wrangling Dalvik 系列中描述得很清楚。

    下面是关键的步骤:

    1. 通过 BugsnagCrashlytics, 或者 Developer Console了解OOM

    2. 主动重现问题。你可能需要买或者借或者偷一个遭遇了崩溃的特殊设备(并不是所有的设备上都会发生内存泄漏!)。你还需要找出是什么串在一起导致了内存泄漏。

    3. 当OOM出现时进行堆转储(dump the heap)(这里介绍了如何做).

    4. 使用MAT或YourKit内存检测工具检测内存的变化,并找出哪个对象应该被垃圾回收;

    5. 从那个对象到GC roots推断最短的强引用路径;

    6. 在路径中找出不存在的引用,并修复memory leak;

    要是有一个库可以为你做完所有的事情,让你专注于修复内存泄漏的问题,那该有多好。

    LeakCanary介绍

    LeakCanary 是一个开源的在debug版本中检测内存泄漏的java库。

    让我们来看看一个cait的例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class Cat {
    }
    class Box {
      Cat hiddenCat;
    }
    class Docker {
      static Box container;
    }
     
    // ...
     
    Box box = new Box();
    Cat schrodingerCat = new Cat();
    box.hiddenCat = schrodingerCat;
    Docker.container = box;

    创建一个RefWatcher实例,然后给它一个对象让它观察:

    1
    2
    // We expect schrodingerCat to be gone soon (or not), let's watch it.
    refWatcher.watch(schrodingerCat);

    当检测出泄漏的时候,你会自动得到一个漂亮的泄漏线索:

    1
    2
    3
    * GC ROOT static Docker.container
    * references Box.hiddenCat
    * leaks Cat instance

    我们知道你的时间宝贵,因此我们让它非常好设置。只需几行代码,LeakCanary就能自动检测Activity的泄漏:

    1
    2
    3
    4
    5
    6
    public class ExampleApplication extends Application {
      @Override public void onCreate() {
        super.onCreate();
        LeakCanary.install(this);
      }
    }

    当内存不足时,会有一个通知和良好的展示界面:

    leaktrace.png

    结论

    在启用LeakCanary之后,我们发现和修复了许多内存泄漏的问题。我们甚至发现了一些 Android SDK中的泄漏

    结果是非常令人惊奇的,我们现在减少了94%的oom崩溃问题。

    oom_rate.png

    如果你想终结OOM崩溃,现在就安装LeakCanary!

  • 相关阅读:
    springmvc 之 url映射restful 及 ant
    springmvc 之 处理方法的返回值类型
    springmvc 之 数据处理
    springmvc 之 使用注解开发springmvc
    springmvc 之 配置及流程
    springmvc 之 springmvc简介,开发步骤
    mybatis 之 mybatis整合spring
    mybatis 之 mybatis缓存
    mybatis 之 mybatis的映射
    SuperMap iClient3D for WebGL教程 水面特效制作
  • 原文地址:https://www.cnblogs.com/yangxia-test/p/5064956.html
Copyright © 2020-2023  润新知