2017-07-28 89 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。