我正在构建一个包含 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());
}
});
有什么方法可以检测内存即将用完,这样我就可以优雅地处理它而不会导致应用程序崩溃?
Best Answer-推荐答案 strong>
我已经与 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/
|