检测WebView内的可用内存

Ben*_*aum 15 javascript java android google-chrome android-webview

我正在构建一个包含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());
  }
});
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*aum 7

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

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

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

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