javascript - 检测 WebView 内的可用内存

标签 javascript java android google-chrome android-webview

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

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

我在我的应用程序中收听 onMemoryTrim - 但在这种情况下,在内存超过 1GB 的设备上永远不会调用它。 (即使使用 TRIM_MEMORY_RUNNING_LOW 也不行)。

有什么方法可以检测到我的 WebView 内存不足并终止它或让它知道(以便它可以释放内存)?

我试过轮询 performance.memory 但它没有用。如果在 WebView 中执行,以下脚本会使 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());
  }
});

有没有什么方法可以检测到内存即将用完,这样我就可以在应用程序不崩溃的情况下优雅地处理它?

最佳答案

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

Sometimes, the amount of required memory exceeds the amount JavaScript can require and crashes the Chromium process of the WebView which crashes my app.

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

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

关于javascript - 检测 WebView 内的可用内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45382757/

相关文章:

javascript - 附加 span 元素和 fadeOut jQuery

javascript - 在 JavaScript 中,字符串/数组的 .length 属性是否进行任何处理?

java - Android 中频繁更改 View 的最佳方法?

java - EnumMap 和 Java 泛型

javascript - 获取由类标识的元素的位置

javascript - 如何在浏览器的新选项卡上显示Base64图像?

java - 为什么 Spring 4 只允许在一个上下文中使用一个 TaskScheduler?

java - 插入中的 SQLite 无法识别的 token 异常

android - 如何获取 android 中特定图像文件夹的 Galley Thumbnail?

Android 不支持的操作异常 : Can't convert to color: type=0x2