检测 Web 视图内的可用内存

我正在构建一个应用程序,其中包含运行一些JavaScript代码的应用程序。JavaScript代码分配非常繁重,可能需要大量内存。WebView

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

我在我的应用程序中收听 - 但在这种情况下,在内存超过1GB的设备上从未调用过它。(甚至没有)。onMemoryTrimTRIM_MEMORY_RUNNING_LOW

有没有办法检测到我的WebView内存不足,并杀死它或让它知道(这样它就可以释放内存)?

我尝试过轮询,但它不起作用。以下脚本会在 WebView 中执行,则会使其崩溃:performance.memory

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());
  }
});

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


答案 1

我已经与Chromium团队和Android团队讨论了这个问题,目前(他们认为并且我相信他们)这是不可能的

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

但是,您可以使用新的终止句柄 API 在 Android 8.0+ 中捕获内存不足的崩溃。因此,这可以通过不必首先检查所需的可用内存来解决我的问题。

通过覆盖 - 我们可以捕获错误并重新创建WebView。onRenderProcessGone


答案 2