/ /ガベージコレクターを明示的に呼び出すことはできますか? [複製]-Java、ガベージコレクション

ガベージコレクタを明示的に呼び出すことはできますか? [重複] - Java、ガベージコレクション

私のアプリケーションには多くの反復があります。 今まで、メモリの問題に直面していませんでした。しかし、コードレベルから、メモリリークとメモリ不足の問題を引き起こす場所はほとんどないと思います。ガベージコレクタを手動で呼び出すことを考えています。手動で?

回答:

回答№1は26

以下を使用してガベージコレクターを呼び出すことができます。

System.gc();

しかし、これは「すぐに実行される」という意味ではありません。JVMはいつ実行するかを決定します。一般に、JVMが OutOfMemoryError、呼び出し System.gc() それを防ぐことはできません。なぜ大量のメモリをリークしているのかを調査し、途中でクリーンアップします。

JavaDoc

gcメソッドを呼び出すと、Java仮想マシンの支出 メモリを作るために未使用のオブジェクトをリサイクルする努力 現在、それらはすぐに再利用できるように占有されています。制御が戻るとき メソッド呼び出しから、Java Virtual Machineは最善を尽くしました 破棄されたすべてのオブジェクトからスペースを回収する


回答№2のための8

ガベージコレクターを手動で呼び出すことをお勧めしますか?

いいえ、それは間違いなく良い習慣ではありません。

あなたは使うことができます System.gc()。これは、ガベージコレクターの呼び出しを保証するものではないことに注意してください。ガベージコレクションを行うことをお勧めします。

OracleのJVMのガベージコレクタには、いつ、何をクリーンアップするかを決定するための洗練されたロジックが多数含まれています。チューニングには、動作の詳細に関する知識が必要です。 System.gc() プログラムのどこかがあまり役に立たない可能性があり、実際、それはさらに悪化させる可能性さえあります。

見る Java SE 6 HotSpot Virtual Machine Garbage Collection Tuning Java SE 6でガベージコレクションを調整する方法の詳細。


回答№3の6

Garbage Collectorを明示的に呼び出すことができますが、JVMは呼び出しを処理するかどうかを決定します。 理想的には、 ガベージコレクターの呼び出しに依存するコードを記述しないでください。

JVMは内部的に何らかのアルゴリズムを使用して、この呼び出しをいつ実行するかを決定します。を使用して電話をかけるとき System.gc()、それはJVMへの単なるリクエストです JVMはいつでもそれを無視することを決定できます。


答え№4のための5

はい、あなたは明示的にガベージコレクタを呼び出すことができます

System.gc();

しかし、発生することは、「JVMにガベージコレクションをすぐに実行するように命令できないことです。JVMはガベージコレクションを実行するタイミングを決定します。したがって、手動で呼び出すことはお勧めできません。

またに関して OutOfMemoryException 手動でガベージコレクションを行うことはあなたを助けませんJVMは可能な限りすべてのメモリを解放した後にこの例外をスローするため、例外を防止します。ガベージコレクションを実行するタイミングと方法を決定する非常に高度なアルゴリズムがあります。 だから私が提案しているのは OutOfMemoryException その後、プログラムを再確認して効率を上げるか、ヒープ領域を増やします。


答え№5の場合は3

ガベージコレクター(およびさまざまなレベルのコレクション)を手動でトリガーできるかどうか、およびこれがパフォーマンスに与える影響(実際は 議論に値するトピック)、OutOfMemoryErrorsを防止しません。JVMがメモリを使い果たしそうになったとき、とにかくできる限り徹底的な収集を行います。そのコレクションの後に十分なメモリが利用できない場合にのみ、エラーが発生します。自分で早くコレクションをトリガーした場合でも、結果(再利用されるメモリの量)は同じです。

メモリリークは、ガベージコレクションをより頻繁に実行しても修正できません。

プログラムで修正する必要があります(停止不要になったものを参照することや、JVMまたはランタイムライブラリ自体の(最悪の場合、「本当の」リークの場合)(ただし、長年のサービスの後、本物のメモリ管理バグは存在しないはずです)。


答え№6の2

System.gc()を呼び出してもGCは保証されません。本当にメモリが必要な場合は、ガベージが収集されます。
ここで異なるガベージコレクターを見ることができます。
http://javarevisited.blogspot.in/2011/04/garbage-collection-in-java.html

ニーズに応じて、これらのGCをコマンドラインパラメーターに含めることができます。