Android-WebView还会存在内存泄漏吗?
一直听说 WebView 使用不当容易造成内存泄漏,网上有很多针对内存泄漏的解决方案,比较多的是在 Activity.onDestroy 的时候将 WebView 从 View 树中移除,然后再调用 WebView.destroy 方法:
override fun onDestroy() {
val parent = webView?.parent
if (parent is ViewGroup) {
parent.removeView(webView)
}
webView?.destroy()
super.onDestroy()
}
于是我写了一个简单的包含一个 WebView 的 Activity,然后在 Activity.onDestroy 中分别尝试 啥也不干 和 只调用 WebView.destroy 方法,接着项目里面集成了 leakcanary 用来检测内存泄漏,启动 App 后,反复横屏竖屏,发现 Activity.onDestroy 有被正常调用,但是 leakcanary 并没有提示有内存泄漏,因此猜想 WebView 高版本应该把这个问题修复了。我用的测试机是 Android 9 版本的,于是想着换个低版本的机型试试,就弄了个 Android 6 的手机一跑,发现还是没有发生内存泄漏,看了下网上这些讲 WebView 内存泄漏的文章,有的还是 2019 年的,既然都 2019 年了还在谈 WebView 会造成内存泄漏,那感觉 Android 6 的机型不应该表现正常呀,一脸懵逼。。。秉着不弄明白不罢休的原则,遇到这种问题好办,Read The Fucking Source Code
就完事了。
具体解析参考 Android-WebView还会存在内存泄漏吗?,下面给出总结:
WebView 中的内存泄漏其实与 Chromium 内核版本有关,在新版本的 Chromium 内核中内存泄漏问题已经被解决了,而且从 Android 5.0(Lollipop) 版本开始将 Chromium WebView 迁移到了一个独立的 APP – Android System WebView
,随着 Android System WebView
的独立发布,低版本 Android 系统(Android 5以上)上搭载的 Chromium 内核一般来说也不会太旧,所以出现内存泄漏的概率应该是比较小的。如果仍需要兼容这很小的一部分机型,可以通过文章开头的方式销毁 WebView,即先移除 WebView 组件,确保先调用到 onDetachedFromWindow 方法解注册,然后再通过 WebView.destroy 方法处理其它销毁逻辑。
上一篇: python 使用多线程导致内存泄漏问题
下一篇: vue 的双向绑定的原理是什么
推荐阅读
-
JVM源码分析之警惕存在内存泄漏风险的FinalReference(增强版)
-
一个小疑点 用serialize()函数之后,返回的string保存在内存吗
-
JVM源码分析之警惕存在内存泄漏风险的FinalReference(增强版)
-
java之int,double,float,long,字节,位和他们之间存在的内存泄漏
-
jar包内存在同名同路径的配置文件,会出问题吗?
-
Java - Java中会存在内存泄漏吗,请简单描述。
-
java中会存在内存泄漏吗?垃圾回收的优点和原理。并考虑2种回收机制。
-
J003_Java中存在内存泄漏吗?
-
Java 中会存在内存泄漏吗?
-
java中会存在内存泄漏吗?什么情况下才是内存泄漏?