私はWebView
を含むアプリケーションをビルドしています。これにはJavaScriptコードがいくつかあります。その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はクラッシュではなく、クラッシュしたり、アプリでキャッチしてクラッシュさせたりする方法はありませんが、純粋に興味のあるPoCからメモリ使用量を測定する方法にも興味があります。 –
@CommonsWareと明らかに8.0ではXから回復する方法が導入されています - https://developer.android.com/preview/features/managing-webview.html#termination-handle –