检测WebView内的可用内存

时间:2017-07-28 21:35:50

标签: javascript java android google-chrome android-webview

我正在构建一个包含运行一些JavaScript代码的WebView的应用。该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());
  }
});

有没有办法检测内存即将用完所以我可以优雅地处理它而不会崩溃?

1 个答案:

答案 0 :(得分:7)

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

  

有时,所需的内存量超过了JavaScript可能需要的数量,并且崩溃了导致我的应用崩溃的WebView的Chromium进程。

然而,您可以使用the new termination handle API在Android 8.0+中捕获内存崩溃。所以这可以解决我的问题,因为不必首先检查所需的可用内存。

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