对战内存泄露
排查内存泄露是一个全手工的过程,这在 Raizlabs 的 Wrangling Dalvik 系列文章中有详细描述。
以下几个关键步骤:
-
通过 Bugsnag, Crashlytics 或者 Developer Console 等统计平台,了解
OutOfMemoryError
情况。 -
重现问题。为了重现问题,机型非常重要,因为一些问题只在特定的设备上会出现。为了找到特定的机型,你需要想尽一切办法,你可能需要去买,去借,甚至去偷。 当然,为了确定复现步骤,你需要一遍一遍地去尝试。一切都是非常原始和粗暴的。
-
在发生内存泄露的时候,把内存 Dump 出来。具体看这里。
-
计算这个对象到 GC roots 的最短强引用路径。
-
确定引用路径中的哪个引用是不该有的,然后修复问题。
很复杂对吧?
如果有一个类库能在发生 OOM 之前把这些事情全部都搞定,然后你只要修复这些问题就好了,岂不妙哉!
public class ExampleApplication extends Application {
private RefWatcher mRefWatcher;
@Override public void onCreate() {
super.onCreate();
mRefWatcher = LeakCanary.install(this);
}
public RefWatcher refWatcher() {
return mRefWatcher;
}
}
act销毁的时候检测它
@Override
protected void onDestroy() {
super.onDestroy();
getApplication().refWatcher().watch(this);
}
fragment销毁时检测它
@Override
public void onDestroy() {
super.onDestroy();
getActivity().getApplication().refWatcher().watch(this);
}