LeakCanary常用插件:检测所有的内存泄漏
来源:互联网 发布:英国博士 知乎 编辑:程序博客网 时间:2024/05/13 09:43
编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识、前端、后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过!
原文: LeakCanary: Detect all memory leaks!
ava.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的注册过程中,我们在bitmap上 绘制了一个用户的签名。这个bitmap和设备的屏幕大小相当,在创建它的时候,我遇到了相当数量的OOM导致的崩溃。
我们试过了几种方法,没有一个解决了我们的问题:
使用
Bitmap.Config.ALPHA_8
(签名是不需要颜色的)捕获
OutOfMemoryError
,触发垃圾回收然后重试几次(从GCUtils 获得的启发)我们没有考虑过将bitmap分配在堆内存之外,那个时候Fresco 还没出现。
我们看待问题的方式是不对的
bitmap的大小本身不是什么问题。当内存快要满了的时候,OOM随时随地都可能发生。尤其是在创建大对象的时候更容易发生,比如bitmap。OOM一般代表着更深层次的问题:内存泄漏。
什么是内存泄漏?
有些对象只有有限的生命周期。当它们的任务完成之后,它们将被垃圾回收。如果在对象的生命周期本该结束的时候,这个对象还被一系列的引用,这就会导致内存泄漏。随着泄漏的累积,app将消耗完内存。
比如,在Activity.onDestroy()
被调用之后,view树以及相关的bitmap都应该被垃圾回收。如果一个正在运行的后台线程继续持有这个Activity的引用,那么相关的内存将不会被回收,这最终将导致OutOfMemoryError崩溃。
寻找内存泄漏
寻找内存泄漏是一个人工操作的过程,在Raizlabs的 Wrangling Dalvik 系列中描述得很清楚。
下面是关键的步骤:
通过 Bugsnag, Crashlytics, 或者 Developer Console了解OOM
主动重现问题。你可能需要买或者借或者偷一个遭遇了崩溃的特殊设备(并不是所有的设备上都会发生内存泄漏!)。你还需要找出是什么串在一起导致了内存泄漏。
当OOM出现时进行堆转储(dump the heap)(这里介绍了如何做).
使用MAT或YourKit内存检测工具检测内存的变化,并找出哪个对象应该被垃圾回收;
从那个对象到GC roots推断最短的强引用路径;
在路径中找出不存在的引用,并修复memory leak;
要是有一个库可以为你做完所有的事情,让你专注于修复内存泄漏的问题,那该有多好。
LeakCanary介绍
LeakCanary 是一个开源的在debug版本中检测内存泄漏的java库。
让我们来看看一个cait的例子:
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
我们知道你的时间宝贵,因此我们让它非常好设置。只需几行代码,LeakCanary就能自动检测Activity的泄漏:
public class ExampleApplication extends Application { @Override public void onCreate() { super.onCreate(); LeakCanary.install(this); }}
当内存不足时,会有一个通知和良好的展示界面:
结论
在启用LeakCanary之后,我们发现和修复了许多内存泄漏的问题。我们甚至发现了一些 Android SDK中的泄漏。
结果是非常令人惊奇的,我们现在减少了94%的oom崩溃问题。
如果你想终结OOM崩溃,现在就安装LeakCanary!
- LeakCanary常用插件:检测所有的内存泄漏
- LeakCanary:检测所有的内存泄漏
- LeakCanary:检测所有的内存泄漏
- LeakCanary:检测所有的内存泄漏
- LeakCanary:检测所有的内存泄漏
- Android开发:LeakCanary--检测所有的内存泄漏
- 内存泄漏的检测;leakCanary
- leakcanary 检测内存泄漏
- leakcanary 检测内存泄漏
- 检测内存泄漏的常见工具-LeakCanary
- LeakCanary:检测所有的内存泄漏----让内存泄露无所遁形
- LeakCanary:检测所有的内存泄露
- LeakCanary:检测所有的内存泄露
- Android内存泄漏检测-LeakCanary
- Android内存泄漏检测-LeakCanary
- 用 LeakCanary 检测内存泄漏
- 使用LeakCanary检测内存泄漏
- Android-LeakCanary检测内存泄漏
- C++ 为什么不加入垃圾回收机制
- ffmpeg错误打印Invalid UE golomb code的解决
- 告别
- 协同过滤(ALS)算法原理及Spark MLlib调用实例(Scala/Java/Python)
- NSLog 输出格式
- LeakCanary常用插件:检测所有的内存泄漏
- 数据挖掘和机器学习的策略
- opencv中copyTo函数的使用
- Material Design Button的使用方法以及默认间距问题的适配
- ORA-01078和ORA-00109的解决方法
- mac使用Dryrun做到不用运行Android Studio即可在模拟器安装预览GitHub开源项目
- IGMP Snooping和Proxy的区别
- 标准屏幕的调用和自定义选择屏幕的切换
- mac os下 ionic 2 安装(一),酷炫的hello world 先跑起来!!