我正在构建一个包含运行一些JavaScript代码的WebView
的应用。该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());
}
});
有没有办法检测内存即将用完所以我可以优雅地处理它而不会崩溃?
答案 0 :(得分:7)
我已经与Chromium团队和Android团队进行了讨论,目前(他们认为并且我相信他们)这是不可能的。
有时,所需的内存量超过了JavaScript可能需要的数量,并且崩溃了导致我的应用崩溃的WebView的Chromium进程。
然而,您可以使用the new termination handle API在Android 8.0+中捕获内存崩溃。所以这可以解决我的问题,因为不必首先检查所需的可用内存。
通过覆盖onRenderProcessGone
- 我们可以捕获错误并重新创建WebView。