2017-07-28 91 views
13

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

有什麼方法來檢測內存即將用完,所以我可以優雅地處理它,而不應用程序崩潰?

+0

'onTrimMemory()'是基於整體生命週期事件和免費*系統RAM *量調用的。你的問題似乎與某種進程限制有關(例如,標準應用程序堆限制),並且我不希望在這種情況下調用onTrimMemory()。 – CommonsWare

+0

@CommonsWare感謝,我沒有意識到這些是全系統觸發的鉤子。 Chrome的JavaScript限制似乎是錯誤的地方。坦率地說 - 這是因爲[Chrome漏洞](https://bugs.chromium.org/p/chromium/issues/detail?id=749482),當它達到一定的限制時 - 崩潰(與我的應用程序)。在這個XY問題中,我的X是Chrome沒有崩潰或有辦法在我的應用中捕獲它並且不會崩潰 - 儘管我對如何從純粹好奇的PoC測量內存使用感興趣。 –

+0

@CommonsWare,顯然8.0引入了一種方法來從X恢復 - https://developer.android.com/preview/features/managing-webview.html#termination-handle –

回答

6

我已經與Chromium團隊和Android團隊討論過這個問題,他們現在(他們認爲我相信他們)認爲這是不可能的

有時候,所需內存的數量超過了JavaScript可能需要的數量,並導致WebView的Chromium進程崩潰,導致崩潰我的應用程序。

但是,您可以使用the new termination handle API捕捉Android 8.0+中的內存崩潰。所以這可以解決我的問題,無需首先檢查可用內存。

通過覆蓋onRenderProcessGone - 我們可以捕獲錯誤並重新創建WebView。