かなりの量のメモリを使用して複雑なシーンをセットアップする OpenGL Android アプリがあり、これが明らかにヒープの断片化を大幅に引き起こします。メモリ リークはありませんが、断片化によるメモリ不足なしにアプリを破棄して作成することは不可能です。(断片化は間違いなく問題であり、リークではありません)
Android には同じ VM/ヒープでアクティビティを破棄および作成する習慣があり、明らかにアクティビティがクラッシュするため、これは大きな問題を引き起こします。これに対抗する戦略として、次の手法を使用しました。
@Override
protected void onStop() {
super.onStop();
if(isFinishing()) {
System.runFinalizersOnExit(true);
System.exit(0);
}
}
これにより、アクティビティが終了すると VM が完全にシャットダウンされるため、次にアクティビティが開始されたときにフラグメント化されていない新しいヒープが取得されます。
注: これは「Android のやり方」ではないことは承知していますが、ガベージ コレクターが圧縮されていないことを考えると、ヒープを継続的に再利用することは不可能です。
この手法は実際には一般的に機能しますが、アクティビティが非終了モードで破棄されてから再作成された場合は機能しません。
ヒープの劣化を処理する方法について何か良い提案はありますか?
さらに注意: メモリ消費量を削減することも、実際にはオプションではありません。アクティビティは実際にはそれほど多くのメモリを使用しませんが、ヒープ (およびネイティブ ヒープ) は、おそらく大きなメモリ チャンクが原因で、簡単に断片化されるようです。