Android5.1 Webview内存泄漏分析

问题现象

Android 5.1 系统,App存在 WebView 泄漏情况,还比较严重。通过内存泄漏分析得到的GC roots引用如下: 每新打开一次WebViewActivity,就会发生就会发生一次Webview实例无法释放,新增一个对象。上图中的两个AppSearchWebView实例,就是由于打开了两次导致。

问题分析

出现了这个问题分析起来还是比较简单的,根据这个引用关系,我们可以直观的看到是由于 Appsearch(extends Application)的 mComponentCallbacks 一直在强引用AWComponentCallbacks,导致无法释放。然后AWComponentCallbacks -> AWContents > AppSearchWebView。 通过分析代码发现关键在于 AwContents 这里的 AwComponentsCallbacks 为什么没有释放。

看上面这段代码看不出来什么问题,onAttach的时候 register,detach的时候 unregister,咋一看一切正常。难道是由于 if (isDestroyed()) return方法提前返回了。

当调用 Webview.destroy() 后 这个判断 返回true。我们看下哪里调用了 webview.destroy()

这是使用webview的通用做法,在Activity的onDestroy生命周期方法中调用webview.onDestroy曾经屡试不爽。通过调试发现,确实是由于此调用导致的。onDestroy 发生在 onDetach 之前。那为什么 android 5.1 之前的webview没有内存泄漏呢?看下面的源码:

相对于 5.1 的代码少了那句 if (isDestroyed()) return;

解决方法

在destroy之前,把webview 从 parent 中 remove 掉,可以提前detach。

推荐阅读

Android内存泄漏分析实战

LeakCanary让Android内存泄漏无处遁形

参考文章:http://coolpers.github.io/webview/memory/leak/2015/07/16/android-5.1-webview-memory-leak.html



  copyright@黑月神话,转载请注明出处:vjson.com

发表评论