我正在構建一個包含運行一些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 –