检测 WebView 内的可用内存
Detect available memory inside of a WebView
我正在构建一个包含 WebView
运行 一些 JavaScript 代码的应用程序。 JavaScript 代码的分配量很大,可能需要大量内存。
有时,所需的内存量超过了 JavaScript 可以要求的量并导致 WebView 的 Chromium 进程崩溃,从而导致我的应用程序崩溃。
我在我的应用程序中收听 onMemoryTrim
- 但在这种情况下,在内存超过 1GB 的设备上从未调用它。 (甚至没有 TRIM_MEMORY_RUNNING_LOW
)。
有什么方法可以检测到我的 WebView 内存 运行ning 内存不足并终止它或让它知道(以便它可以释放内存)?
我试过轮询 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 团队讨论过这个问题,目前(他们认为并且我相信他们)这是不可能的。
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。
我正在构建一个包含 WebView
运行 一些 JavaScript 代码的应用程序。 JavaScript 代码的分配量很大,可能需要大量内存。
有时,所需的内存量超过了 JavaScript 可以要求的量并导致 WebView 的 Chromium 进程崩溃,从而导致我的应用程序崩溃。
我在我的应用程序中收听 onMemoryTrim
- 但在这种情况下,在内存超过 1GB 的设备上从未调用它。 (甚至没有 TRIM_MEMORY_RUNNING_LOW
)。
有什么方法可以检测到我的 WebView 内存 运行ning 内存不足并终止它或让它知道(以便它可以释放内存)?
我试过轮询 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 团队讨论过这个问题,目前(他们认为并且我相信他们)这是不可能的。
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。