Android用Monoのガベージコレクターに問題があり、それについて調査していて、使用していないオブジェクトを解放するために、すべてのOnDestroy()メソッドにGC.Collect()を手動で配置する必要があると言っています。 Java.Lang.Objects に Dispose を使用することはできませんが、アプリはまだメモリを消費してインクリメントしています。どうすれば解決できますか?
1 に答える
主な質問: それは実際の問題ですか? ガベージ コレクターは本質的に非決定論的であるため、メモリの使用量はかなり異なります。これは必ずしも問題ではありません。それは物事の一部にすぎません。グローバル参照が定期的に不足しているか、プロセス ヒープを使い果たしている場合、これは問題です。gref が増加しているだけで、コレクションが自然に発生すると減少する場合は、心配する必要はないかもしれません。
問題がある場合は、問題の詳細が必要です。たとえば、Bitmapインスタンスは簡単にメモリを使い果たす可能性があり、Bitmap のソリューションは必ずしも一般的なすべてに適用できるわけではありません。
詳細情報を取得するには、グローバル参照メッセージを有効にして、グローバル参照がいつ作成され、いつ破棄されるかを確認できます。
さらに、GC ヒューリスティックを常に更新しています。Mono for Android 4.1.0 ではGC.Collet()
、プラットフォームの最大 gref 値の 80% の gref しきい値 (エミュレーターでは 1800 gref) に達すると、 が自動的に呼び出されるように変更が導入されました。OnDestroy()
これにより、を呼び出す必要がほとんどなくなりますGC.Collect()
が、(いつものように) GC は「不適切な瞬間」に起動する可能性があるため、GC.Collect()
とにかく明示的な方が望ましい場合があります。