オブジェクトに値を設定するnull
だけで、ガベージ コレクションが Java (Android) でメモリを収集してクリアするのに十分ですか?
3 に答える
オブジェクトへのすべての参照が null に設定されている場合、最終的にはガベージ コレクターによってクリーンアップされます。これで十分かどうかは、オブジェクトが保持する他のリソース (リークされる可能性のあるファイル ハンドルや db ハンドルなど) と、メモリが必要になる前に解放するのに十分な頻度でガベージ コレクターが実行されるかどうかによって異なります。ビットマップのような大きなオブジェクトには、その問題を回避するためにメモリを早期に解放するために呼び出すことができる関数がよくあります (ビットマップの recycle() は一例です)。
はい。これが、Java でオブジェクトを解放する方法です。それらが解放されると、ガベージ コレクションの対象となり、後で収集されます。
ガベージ コレクションは、マーク アンド スイープを行います。
マークアンドスイープを使用する場合、参照されていないオブジェクトはすぐには回収されません。代わりに、使用可能なすべてのメモリが使い果たされるまでガベージが蓄積されます。その場合、マークアンドスイープ アルゴリズムがすべてのガベージを収集している間、プログラムの実行は一時的に中断されます。参照されていないすべてのオブジェクトが再利用されると、プログラムの通常の実行が再開されます。
http://www.brpreiss.com/books/opus5/html/page424.html . リンクには、マークとスイープの仕組みに関する詳細が含まれています。
http://chaoticjava.com/posts/how-does-garbage-collection-work/
変数を null に設定した場合。変数はガベージ コレクションに使用できます。ただし、ガベージ コレクションのタイミングを決定するのは、仮想マシン (dalvik) に依存します。また、ヒープサイズにも依存します。ヒープ サイズが大きいほど、ガベージ コレクションの頻度が高くなります。http://www.youtube.com/watch?v=_CruQY55HOk . ビデオの男は、大きなヒープを使用するとガベージ コレクションが頻繁に発生し、アプリケーションが一時停止するため、大きな警告を発しています。
現在実行中の操作がより多くのメモリを必要とし、メモリが利用できない場合、ガベージ コレクタが起動してメモリを解放します (必要なメモリ領域が利用できない場合でも、メモリ リークが発生します)。
http://developer.android.com/training/articles/perf-tips.html。
上記リンクより引用。アプリでより多くのオブジェクトを割り当てると、定期的なガベージ コレクションが強制され、ユーザー エクスペリエンスに小さな「問題」が生じます。