LeakCanary: 让内存泄露无所遁形
本文为LeakCanary: Detect all memory leaks!的翻译。原文在: https://corner.squareup.com/2015/05/leak-canary.html
java.lang.OutOfMemoryError
at android.graphics.Bitmap.nativeCreate(Bitmap.java:-2)
at android.graphics.Bitmap.createBitmap(Bitmap.java:689)
at com.squareup.ui.SignView.createSignatureBitmap(SignView.java:121)
谁也不会喜欢 OutOfMemoryError
在 Square Register 中, 在签名页面,我们把客户的签名画在 bitmap cache 上。 这个 bitmap 的尺寸几乎和屏幕的尺寸一样大,在创建这个 bitmap 对象时,经常会引发 OutOfMemoryError
,简称OOM
。
当时,我们尝试过一些解决方案,但都没解决问题
-
使用 Bitmap.Config.ALPHA_8 因为,签名仅有黑色。
-
捕捉
OutOfMemoryError
, 尝试 GC 并重试(受 GCUtils 启发)。 -
我们没想过在 Java heap 内存之外创建 bitmap 。苦逼的我们,那会 Fresco 还不存在。
路子走错了
其实 bitmap 的尺寸不是真正的问题,当内存吃紧的时候,到处都有可能引发 OO。在创建大对象,比如 bitmap 的时候,更有可能发生。OOM 只是一个表象,更深层次的问题可能是: 内存泄露。
什么是内存泄露
一些对象有着有限的生命周期。当这些对象所要做的事情完成了,我们希望他们会被回收掉。但是如果有一系列对这个对象的引用,那么在我们期待这个对象生命周期结束的时候被收回的时候,它是不会被回收的。它还会占用内存,这就造成了内存泄露。持续累加,内存很快被耗尽。
比如,当 Activity.onDestroy
被调用之后,activity 以及它涉及到的 view 和相关的 bitmap 都应该被回收。但是,如果有一个后台线程持有这个 activity 的引用,那么 activity 对应的内存就不能被回收。这最终将会导致内存耗尽,然后因为 OOM 而 crash。
对战内存泄露
排查内存泄露是一个全手工的过程,这在 Raizlabs 的 Wrangling Dalvik 系列文章中有详细描述。
以下几个关键步骤:
-
通过 Bugsnag, Crashlytics 或者 Developer Console 等统计平台,了解
OutOfMemoryError
情况。 -
重现问题。为了重现问题,机型非常重要,因为一些问题只在特定的设备上会出现。为了找到特定的机型,你需要想尽一切办法,你可能需要去买,去借,甚至去偷。 当然,为了确定复现步骤,你需要一遍一遍地去尝试。一切都是非常原始和粗暴的。
-
在发生内存泄露的时候,把内存 Dump 出来。具体看这里。
-
计算这个对象到 GC roots 的最短强引用路径。
-
确定引用路径中的哪个引用是不该有的,然后修复问题。
很复杂对吧?
如果有一个类库能在发生 OOM 之前把这些事情全部都搞定,然后你只要修复这些问题就好了,岂不妙哉!
LeakCanary
LeakCanary 是一个检测内存泄露的开源类库。你可以在 debug 包种轻松检测内存泄露。
先看一个例子:
class Cat {
}
class Box {
Cat hiddenCat;
}
class Docker {
// 静态变量,将不会被回收,除非加载 Docker 类的 ClassLoader 被回收。
static Box container;
}
// ...
Box box = new Box();
// 薛定谔之猫
Cat schrodingerCat = new Cat();
box.hiddenCat = schrodingerCat;
Docker.container = box;
创建一个RefWatcher
,监控对象引用情况。
// 我们期待薛定谔之猫很快就会消失(或者不消失),我们监控一下
refWatcher.watch(schrodingerCat);
当发现有内存泄露的时候,你会看到一个很漂亮的 leak trace 报告:
- GC ROOT static Docker.container
- references Box.hiddenCat
- leaks Cat instance
我们知道,你很忙,每天都有一大堆需求。所以我们把这个事情弄得很简单,你只需要添加一行代码就行了。然后 LeakCanary 就会自动侦测 activity 的内存泄露了。
public class ExampleApplication extends Application {
@Override public void onCreate() {
super.onCreate();
LeakCanary.install(this);
}
}
然后你会在通知栏看到这样很漂亮的一个界面:
结论
使用 LeakCanary 之后,我们修复了我们 APP 中相当多的内存泄露。我们甚至发现了 Android SDK 中的一些内存泄露问题。
结果是惊艳的,我们减少了 94% 的由 OOM 导致的 crash。
如果你也想消灭 OOM crash,那还犹豫什么,赶快使用 LeakCanary
相关链接:
-
一个非常简单的 LeakCanary demo: https://github.com/liaohuqiu/leakcanary-demo
=
+
+
=
+
+
相关推荐
LeakCanary是一款由Square公司开发的强大的内存泄漏检测工具,特别为Android平台设计,可以帮助开发者轻松定位和修复内存泄露问题。下面将详细介绍LeakCanary的工作原理、使用方法以及如何分析其生成的报告。 ### 1...
上面是官方文档给出的介绍,LeakCanary是一个在android上检测内存泄漏的依赖。 使用方法 只需要在你的build.gradle中添加如下依赖即可。 debugImplementation ‘com.squareup.leakcanary:leakcanary-android:2.2’ ...
**LeakCanary内存泄漏检测** 内存泄漏是Android应用程序中常见的问题,它可能导致应用无响应(ANR)、性能下降甚至应用崩溃。为了帮助开发者在早期阶段发现并修复这些问题,Square公司开发了LeakCanary,这是一个...
漏金丝雀适用于Android和Java的内存泄漏检测库。 “微小的泄漏会击沉一艘大船。” - 本杰明·富兰克林入门在您的build.gradle : dependencies { debugImplementation ' ...
LeakCanary是一款由Square公司开发的开源工具,专用于检测Android应用中的内存泄露。这款强大的工具通过简单的集成和自动化的内存分析,帮助开发者轻松定位和修复内存泄露。 在“用LeakCanary检查内存泄露Demo”中...
LeakCanary A memory leak detection library for Android and Java. “A small leak will sink a great ship.” - Benjamin Franklin Getting started In your build.gradle: dependencies { debugCompile '...
LeakCanary是一款由Square公司开发的轻量级内存泄漏检测工具,特别适合在开发和测试阶段使用。它能够自动化地检测并报告应用中的内存泄漏,帮助开发者快速定位问题。 LeakCanary的工作原理主要分为以下几个步骤: ...
LeakCanary是一款由Square公司开发的开源内存泄漏检测库,专为Android应用程序设计。它旨在简化内存泄漏的检测过程,帮助开发者及时发现并修复可能导致应用性能下降或崩溃的内存问题。内存泄漏是Android开发中常见的...
在应用的Application类中安装LeakCanary,这样每当应用运行时,它就会自动检测内存泄露,并在检测到问题时通过通知栏提供详细的泄漏信息。点击通知可以直接查看泄漏的对象和引用链,极大地简化了内存泄露的诊断过程...
【Android程序优化,避免内存泄露】- [实战一]:避免内存泄露的最后一道墙,使用leakcanary分析程序中的内存泄露。 博文地址:http://blog.csdn.net/zxt0601/article/details/51010174
1. 检测Activity内存泄漏:LeakCanary会特别关注Activity,因为它们是常见的内存泄漏来源。如果Activity没有正确地被销毁,LeakCanary会捕捉到这一情况并生成报告。 2. 监控自定义View:开发者可以扩展LeakCanary以...
LeakCanary是适用于Android的可靠内存泄漏检测库。 它通过对Android Framework内部的深入了解,可以有效地检测泄漏并缩小每次泄漏的原因。 这有助于开发人员避免并显着减少OutOfMemoryError(OOM)崩溃。 内存泄漏是...
LeakCanary是Square公司开源的一款轻量级内存泄漏检测库,它针对Android平台进行了优化,能够自动检测并报告应用中的潜在内存泄漏。LeakCanary 1.6.2是该库的一个版本,包含了修复和改进,旨在提高其检测效率和准确...
它通过在应用程序中插入一个专门为检测内存泄漏设计的服务,当检测到对象被意外持有导致无法正常释放时,LeakCanary会自动生成详细的泄露报告,帮助开发者定位问题所在。 1. **LeakCanary的架构** LeakCanary由三...
《LeakCanary详解——内存泄漏检测利器》 在Android应用开发中,内存泄漏是一个常见的问题,它会导致应用性能下降,严重时甚至会使应用崩溃。LeakCanary是一款由Square公司开发的开源库,专为Android应用设计,用于...
它致力于简化内存泄漏的检测过程,让开发者能够更轻松地在开发阶段发现并修复内存泄漏问题,从而提升应用的性能和稳定性,避免线上运行时因内存泄漏导致的崩溃。 内存泄漏在Android开发中是个常见但又棘手的问题。...
LeakCanary是一款强大的内存泄漏检测工具,由Square公司开发,适用于Android和Java应用。本篇文章将详细讲解如何配置并使用LeakCanary进行内存泄露的检测与优化。 首先,我们需要在项目的build.gradle文件中添加...
《wcl-leakcanary-demo: 深入解析检测内存泄漏的技术框架》 内存泄漏是Java应用程序中常见的性能问题,它可能导致系统资源耗尽,影响应用的稳定性和响应速度。LeakCanary是一款强大的开源工具,专为Android和Java...
LeakCanary是一款开源的内存泄漏检测工具,主要用于Android应用开发。它可以帮助开发者发现并定位应用中的内存泄漏问题,从而提高应用的性能和稳定性。在系统源码集成LeakCanary时,通常需要将相关依赖包添加到项目...
标题中的“Pierre-Yves Ricau:用 LeakCanary 检测内存泄漏”指的是 Android 开发中的一个重要话题,即如何使用 LeakCanary 工具来检测和解决应用程序中的内存泄漏问题。LeakCanary 是由 Square 公司开发的一个开源...