在WebView中检测可用内存

15

我正在开发一个包含 WebView 的应用程序,其中运行了一些 JavaScript 代码。这些 JavaScript 代码的内存分配很重,可能需要大量的内存。

有时,所需内存的数量超过了 JavaScript 可以请求的数量,并导致 WebView 的 Chromium 进程崩溃,从而导致我的应用程序崩溃。

我在应用程序中监听 onMemoryTrim - 但在具有超过1GB内存的设备上,即使是 TRIM_MEMORY_RUNNING_LOW ,也从未调用此选项。

是否有任何方法可以检测到我的 WebView 的内存使用率过高并将其关闭或通知它(以便它可以释放内存)?

我尝试过轮询 performance.memory,但它没有起作用。如果在其中执行以下脚本,则会导致WebView 崩溃:

var a = [];

var kek = () => {
  var b = [];
  for(var i = 0; i < 1024 * 1024 * 2; i++) b.push(Math.random());
  return b;
}

var ival = setInterval(() => {
  let m = performance.memory;
  if(m.jsHeapSizeLimit - m.usedJSHeapSize < 1e5) {
    console.log("Memory limited")
  } else {
    a.push(kek());
  }
});

有没有办法检测内存即将耗尽,以便我可以优雅地处理它而不会导致应用崩溃?


onTrimMemory()是根据整体生命周期事件和可用系统RAM的数量进行调用的。您的问题似乎与某种进程限制(例如,标准应用程序堆限制)有关,我不会期望在这种情况下调用onTrimMemory() - CommonsWare
@CommonsWare谢谢,我之前没有意识到这些是系统级的触发钩子。看起来Chrome的JavaScript限制是出了问题的原因。坦率地说 - 这是因为Chrome泄漏,当它达到某个限制时,它会崩溃(与我的应用程序一起)。在这个XY问题中,我的X是希望Chrome不崩溃或者有一种方法来捕获它而不使我的应用程序崩溃 - 尽管我也对如何从纯粹好奇的角度测量内存使用感兴趣。 - Benjamin Gruenbaum
@CommonsWare,显然8.0引入了一种从X中恢复的方法-https://developer.android.com/preview/features/managing-webview.html#termination-handle - Benjamin Gruenbaum
一样的问题..我的堆栈正在耗尽..我想了解JS内存分配..类似这样的内容 https://developer.chrome.com/devtools/docs/heap-profiling - NitZRobotKoder
1个回答

9
我已经与Chromium团队和Android团队讨论过,目前(他们认为,我也相信他们)这是不可能的
有时,所需内存量超出了JavaScript可以请求的数量,并导致WebView的Chromium进程崩溃,从而导致我的应用程序崩溃。
但是,在Android 8.0+中,您可以使用新的终止处理API捕获内存不足崩溃。因此,通过在第一次不必检查所需的可用内存,解决了我的问题。
通过覆盖onRenderProcessGone - 我们可以捕获错误并重新创建WebView。

如何与Android团队沟通?是否有方便的方式?我在Note9上使用WebView时遇到了奇怪的问题。 - 003
@003 要么:为相关的开源项目做出足够的贡献,这样你就能提前了解它们;要么尝试冷邮件(比如从提交日志中获取他们的电子邮件地址并发送邮件,看看他们是否回复)。我两种方法都尝试过。还要记住,chromium-dev 仍然有一定的活跃度。如果在 Note9 上的 webview 上无法重现问题,那么获得帮助的机会几乎为零,因为这很可能不是 Android 或 Chromium 的问题,而是 Vanilla Android/Chromium 安装的问题。 - Benjamin Gruenbaum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接