我正在构建一个应用程序,其中包含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());
}
});
有没有什么方法可以检测内存即将耗尽,以便我可以优雅地处理它而不会导致应用程序崩溃?
我已经与 Chromium 团队和 Android 团队讨论过这个问题,目前(他们认为并且我相信他们)这是不可能的.
有时,所需的内存量超出了 JavaScript 所需的内存量,导致 WebView 的 Chromium 进程崩溃,从而导致我的应用程序崩溃。
但是,您可以在 Android 8.0+ 中使用以下命令捕获内存不足崩溃的情况新的终止句柄 API https://developer.android.com/preview/features/managing-webview.html#termination-handle。因此,这可以解决我的问题,因为不必首先检查所需的可用内存。
通过覆盖onRenderProcessGone
- 我们捕获 bug 并重新创建 WebView。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)