You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 24小时运行WebView双实例预加载页面内存无故增长问题求解

WebView内存持续上涨修复方案

1. 停止频繁创建销毁WebView,严格复用2个固定实例

你当前逻辑是每次预加载都新建WebView、切页就销毁旧WebView,WebView的native层本身存在系统级的内存残留问题,频繁创建销毁会导致残留内存持续堆积,完全不符合你业务要求的「保留2个WebView实例复用」的设计。
修改逻辑:

  • 初始化时直接创建2个WebView实例actualView和preloadView,全程复用不再销毁重建
  • 切页时仅交换两个实例的可见性,调用loadUrl加载新的页面地址即可,不需要移除和销毁实例
  • 移除destroyWebview相关的销毁逻辑,仅在页面切换前调用actualView.loadUrl("about:blank")清空上一个页面的内容即可

2. 修复Handler延迟任务泄漏

你当前每次页面加载完成、切页时都会post新的延迟任务,但从未移除未执行的旧任务,未执行的任务会持有Activity引用,导致内存无法释放,同时还会出现任务重复执行的问题。
修复方法:

  • 每次执行postDelayed之前,先调用HANDLER.removeCallbacksAndMessages(null)清空所有未执行的旧任务
  • 也可以给每个Runnable声明全局变量,精准移除对应的任务,避免误杀其他任务

3. 修复匿名内部类泄漏

你当前给WebView设置的WebViewClient是匿名内部类,会隐式持有外部Activity的引用,导致Activity无法被回收。修改为静态内部类,用弱引用持有Activity实例即可。

4. 移除冗余配置和无效操作

  • 关闭setOffscreenPreRaster(true):这个配置会将预加载页面的完整渲染缓存存在内存中,长期运行会导致内存持续上涨,24小时运行的场景不需要开启这个配置
  • 删除手动GC代码:System.gc()和Runtime.getRuntime().gc()手动调用不会解决内存泄漏问题,反而会频繁触发GC线程占用系统资源,直接删除即可
  • 修复JS类错误:你当前的public static class JsObject extends JSObject属于循环继承,会导致类加载异常,直接去掉继承关系,单独定义静态内部类即可,且JSInterface全局只需要创建一个实例,不要每次新建WebView都重新生成

5. 独立进程兜底方案

针对24小时不间断运行的场景,可以将WebView所在的Activity配置为独立进程,在AndroidManifest.xml中给Activity添加android:process=":webprocess"配置:

  • 独立进程的内存不会占用主进程内存,就算WebView内存缓慢上涨,也不会导致主进程崩溃
  • 可以设置定时任务,每隔6-12小时重启一次WebView进程,直接清空所有累积的内存,对用户无感知

内容的提问来源于stack exchange,提问作者Whotopia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 22:06:04