LeakCanary:Android和Java的内存泄漏检测库。
java.lang.<a href="http://javakk.com/tag/outofmemoryerror" title="查看更多关于 OutOfMemoryError 的文章" target="_blank">OutOfMemoryError</a>
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 **崩溃
在正方形寄存器中,我们在位图缓存上绘制客户的签名。这个位图是设备屏幕的大小,我们在创建它时发生了大量的内存不足(OOM)崩溃。
Java内存泄漏检测库LeakCanary介绍,了解?
我们尝试了几种方法,但都没有解决问题:
位图大小不是问题。当内存几乎满的时候,OOM可以发生在任何地方。在创建大对象(如位图)的地方,这种情况更容易发生。OOM是一个更深层次问题的征兆: **内存泄漏 **。
某些对象的寿命有限。当他们的工作完成后,他们会被垃圾收集起来。如果一个引用链在一个对象的预期生存期结束后将其保存在内存中,这将导致内存泄漏。当这些漏洞累积起来时,应用程序的内存就会耗尽。
例如,在调用 Activity.onDestroy() 时,其视图层次结构及其关联的位图都应该是可垃圾回收的。如果在后台运行的线程持有对活动的引用,则无法回收相应的内存。这最终导致OutOfMemoryError崩溃。
查找内存泄漏是一个手动过程,以下是关键步骤:
如果一个库可以在你到达OOM之前完成所有这些,让你专注于修复内存泄漏呢?
LeakCanary是一个开源Java库,用于检测调试版本中的内存泄漏。
让我们看一个猫的例子:
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就会自动检测活动泄漏:
public class ExampleApplication extends Application {
@Override public void onCreate() {
super.onCreate();
LeakCanary.install(this);
}
}
你会得到一个通知和一个很好的开箱即用的显示:
Java内存泄漏检测库LeakCanary介绍,了解?
启用LeakCanary后,我们发现并修复了应用程序中的许多内存泄漏。我们甚至在Android SDK中发现了一些漏洞。
结果是惊人的。现在,OOM错误导致的崩溃减少了94%。
Java内存泄漏检测库LeakCanary介绍,了解?
如果你想消除OOM崩溃,现在就安装LeakCanary!
Java内存泄漏检测库LeakCanary介绍,了解?