标签:
https://github.com/square/leakcanary
我们尝试了一些方法,但是都没有解决。
比如:
问题并不在bitmap的大小上,当内存快满的时候,肯定会抛出OOM的,当你试图创建大的对象时,会经常抛出OOM异常。而出现OOM更深层次的问题是在于内存泄露。
一些对象有自己限制的生命周期,当他们的工作结束时,他们试图去被gc回收,如果当生命周期结束以后内存中仍然握着这个对象的一些应用的时候,就会出现内存泄露。当内存泄露越来越多的时候,就会出现OOM。
例如, 当Activity.onDestroy()被调用的时候,activity对于的布局,相关的bitmap对象都应该被gc回收,如果一个后台线程在运行,并且握着activity的一个引用,那这个引用就没法背回收,最后就会导致OOM。
监听内存泄露是一个手动的过程。
下面是几个关键的步骤:
让我们在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);
}
}
你会得到一个提醒,和一个漂亮的展示界面
启用 LeakCanary以后,我们发现并修正了在我们的应用程序的许多内存泄漏。我们甚至发现在Android SDK中的几个漏洞。现在,我们已经从OOM错误中减少94%的Crash了。
标签:
原文地址:http://www.cnblogs.com/zrui513/p/4928413.html