我正在构建一个包含运行一些 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/