Android--LeakCanary

https://github.com/square/leakcanary

我们尝试了一些方法,但是都没有解决。
比如:

1.使用bitmap的Bitmap.Config.ALPHA_8
2.捕获OOM的异常,然后出发GC来回收,然后再重新创建
3.我们没有想到去收集bitmap的java堆内存。

2.我们曾以错误的方式来看待它。

问题并不在bitmap的大小上,当内存快满的时候,肯定会抛出OOM的,当你试图创建大的对象时,会经常抛出OOM异常。而出现OOM更深层次的问题是在于内存泄露。

3.什么是内存泄露?

一些对象有自己限制的生命周期,当他们的工作结束时,他们试图去被gc回收,如果当生命周期结束以后内存中仍然握着这个对象的一些应用的时候,就会出现内存泄露。当内存泄露越来越多的时候,就会出现OOM。
例如, 当Activity.onDestroy()被调用的时候,activity对于的布局,相关的bitmap对象都应该被gc回收,如果一个后台线程在运行,并且握着activity的一个引用,那这个引用就没法背回收,最后就会导致OOM。

4.监听内存泄露。

监听内存泄露是一个手动的过程。
下面是几个关键的步骤:

1.学习关于OOM的相关知识。
2.试图去重现这个问题。 你需要去找到出现该问题的手机,你也需要去弄清楚是哪个地方出现这个问题。
3.当出现OOM的时候清空堆内存。
4.使用MAT或者其他工具找到哪些对象需要被回收。
5.计算强引用最短的从该对象到gc根部的路径。 (什么是 path from that object to the GC roots)
6. 找出哪些在该path下不该存在的引用,并且修复该内存泄露。

5. 介绍LeakCanary

LeakCanary 是一个开源的java类库,去检测在开发版本中的内存泄露。

让我们在cat中看一个例子:

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 实例并且给他赋予一个对象去观察。

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

当内存被检测出泄露的时候,你会自动获得一个泄露堆栈信息。

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

我们知道程序员都很忙,所以我们制作了一个和easy的方式去创建,只需要一行代码,LeakCanary 就会自动检测activity的内存泄露。

public class ExampleApplication extends Application {
  @Override public void onCreate() {    super.onCreate();
    LeakCanary.install(this);
  }
}

你会得到一个提醒,和一个漂亮的展示界面

6.结论

启用 LeakCanary以后,我们发现并修正了在我们的应用程序的许多内存泄漏。我们甚至发现在Android SDK中的几个漏洞。现在,我们已经从OOM错误中减少94%的Crash了。
时间: 2024-08-11 01:34:18

Android--LeakCanary的相关文章

利用 LeakCanary 来检查 Android 内存泄漏

前言 你被概率性的 OOM 困扰么?有时候,OOM 像幽灵一样,挥之不去,可真想把它揪出来时,又捉之不着.或许,是时候用 LeakCanary 来诊断一下了.它是一个用来检查 Android 下内存泄漏的开源库,这篇文章主要介绍其用法.架构和其背后的实现原理. Square 有篇文章介绍了开发这个库的原因.他们的一个付款流程里,需要用到用户的签名,他们直接用 Bitmap 来画签名,Bitmap 大小和屏幕分辨率是一样的.问题来了,在试图创建这个 Bitmap 对象时,概率性 OOM 如幽灵般相

Android内存泄漏检测-LeakCanary

square/leakcanary udacity/Sunshine-Version-2 添加LeakCanary依赖包 在主模块app下的build.gradle下添加如下依赖: debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1' 开启LeakCanary 添加Applicat

android 常见的泄漏内存方法和 leakcanary 使用方法

虽然VM接管了内存分配和回收,但是人类在解决问题的同时也会重新创造出一些新的问题,所以问题永远都解决不了,就产生各种稀奇古怪的就业机会了(跑题跑不停). 无论各种VM用什么算法管理内存, 造成内存泄漏的主要原因都是VM认为那些其实可以回收的内存没有被回收,比如各种数据集合中的垃圾数据,各种类静态成员占用永远不会被使用的对象. 1.数据放在各种数据集合中,但是这些数据缺不在使用,这种状况是泄漏的一大原因. 2.设置类的静态成员,然而确不会再使用了. 用leakcanary 检查对象泄漏 leakc

Android工具:LeakCanary—内存泄露检测神器

一.LeakCanary简介LeakCanary是Square公司开源的一个检测内存的泄露的函数库,可以方便地和你的项目进行集成,在Debug版本中监控Activity.Fragment等的内存泄露:LeakCanary集成到项目中之后,在检测到内存泄露时,会发送消息到系统通知栏.点击后打开名称DisplayLeakActivity的页面,并显示泄露的跟踪信息,Logcat上面也会有对应的日志输出.同时如果跟踪信息不足以定位时,DisplayLeakActivity还为开发者默认保存了最近7个d

Android 内存泄露检测工具 LeakCanary

LeakCanary 是 Android 和 Java 内存泄露检测框架.LeakCanary 可以用更加直白的方式将内存泄露展现在我们的面前. 开始使用 在 build.gradle 中加入引用,不同的编译使用不同的引用: ? 1 2 3 4 dependencies {    debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'    releaseCompile 'com.squareup.leakcanary:leak

Android 源码系列之<十四>从源码的角度深入理解LeakCanary的内存泄露检测机制(下)

转载请注明出处:http://blog.csdn.net/llew2011/article/details/52958567 在上边文章Android 源码系列之<十三>从源码的角度深入理解LeakCanary的内存泄露检测机制(中)由于篇幅原因仅仅向小伙伴们讲述了在Android开发中如何使用LeakCanary来检测应用中出现的内存泄露,并简单的介绍了LeakCanary的相关配置信息.根据上篇文章的介绍我们知道LeakCanary为了不给APP进程造成影响所以新开启了一个进程,在新开启的

Android 内存泄露检测工具 LeakCanary 的监控原理

首先回顾一下  java 的几种 reference: 从jdk 1.2 开始,引用分为 强引用,软引用.若引用 和虚引用, 其中 软引用.若引用 和虚引用 和 ReferenceQueue 关联. 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期.这4种级别由高到低依次为:强引用.软引用.弱引

转: android 内存检测工具 LeakCanary 说明

http://www.liaohuqiu.net/cn/posts/leak-canary-read-me/ LeakCanary 中文使用说明 10 May 2015 LeakCanary Android 和 Java 内存泄露检测. “A small leak will sink a great ship.” - Benjamin Franklin 千里之堤, 毁于蚁穴. -- <韩非子·喻老> demo 一个非常简单的 LeakCanary demo: https://github.co

Android 源码系列之&lt;十三&gt;从源码的角度深入理解LeakCanary的内存泄露检测机制(中)

转载请注明出处:http://blog.csdn.net/llew2011/article/details/52958563 在上篇文章Android 源码系列之<十二>从源码的角度深入理解LeakCanary的内存泄露检测机制(上)中主要介绍了Java内存分配相关的知识以及在Android开发中可能遇见的各种内存泄露情况并给出了相对应的解决方案,如果你还没有看过上篇文章,建议点击这里阅读一下,这篇文章我将要向大家介绍如何在我们的应用中使用square开源的LeakCanary库来检测应用中出

Android开发学习之路-LeakCanary使用

LeakCanary是一个内存泄漏检测库,它可以在我们的应用发生内存泄漏的时候发出提醒,提醒包括通知和Log.GitHub 这个库使用起来比较简单: ①添加依赖: 1 dependencies { 2 debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5' 3 releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5' 4 testCompile '