我正在构建一个包含运行一些JavaScript代码的WebView
的应用程序。 JavaScript代码的分配很重,可能需要大量内存。检测WebView内部的可用内存
有时候,所需内存的数量超过了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());
}
});
有什么方法来检测内存即将用完,所以我可以优雅地处理它,而不应用程序崩溃?
'onTrimMemory()'是基于整体生命周期事件和免费*系统RAM *量调用的。你的问题似乎与某种进程限制有关(例如,标准应用程序堆限制),并且我不希望在这种情况下调用onTrimMemory()。 – CommonsWare
@CommonsWare感谢,我没有意识到这些是全系统触发的钩子。 Chrome的JavaScript限制似乎是错误的地方。坦率地说 - 这是因为[Chrome漏洞](https://bugs.chromium.org/p/chromium/issues/detail?id=749482),当它达到一定的限制时 - 崩溃(与我的应用程序)。在这个XY问题中,我的X是Chrome没有崩溃或有办法在我的应用中捕获它并且不会崩溃 - 尽管我对如何从纯粹好奇的PoC测量内存使用感兴趣。 –
@CommonsWare,显然8.0引入了一种方法来从X恢复 - https://developer.android.com/preview/features/managing-webview.html#termination-handle –