15

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

4

6 に答える 6

34

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

System.gc();

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

JavaDoc

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

于 2013-03-26T08:48:40.173 に答える
8

ガベージコレクターを手動で呼び出すのは良い習慣ですか?

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

を使用できますSystem.gc()。これはガベージコレクターを呼び出すことが保証されていないことに注意してください。これは、ガベージコレクションを実行することをお勧めするというヒントをシステムに与えるだけです。

OracleのJVMのガベージコレクタには、クリーンアップするタイミングと対象を決定するための高度なロジックが多数含まれています。それを調整するには、それがどのように機能するかについての詳細についての知識が必要です。プログラムのどこかに置くだけSystem.gc()ではあまり役に立たない可能性があり、実際、それはさらに悪化する可能性があります。

Java SE 6を使用してガベージコレクションを調整する方法の詳細については、 Java SE6HotSpot仮想マシンのガベージコレクションの調整を参照してください。

于 2013-03-26T08:51:05.310 に答える
7

はい、を使用してガベージコレクタを明示的に呼び出すことができます

System.gc();

しかし、何が起こるかというと、JVMにガベージコレクションをすぐに実行するように命令することはできません。JVMは、ガベージコレクトをいつ行うかを独自に決定するため、手動で呼び出すことはお勧めできません。

さらに、OutOfMemoryException手動のガベージコレクションの実行に関しては、JVMが可能なすべてのメモリを再利用した後にこの例外をスローするため、例外を防ぐのに役立ちません。ガベージコレクションをいつどのように実行するかを決定するための非常に高度なアルゴリズムがいくつかあります。だから私が提案するのは、もしあなたが取得しているなら、OutOfMemoryExceptionあなたのプログラムを再チェックすることはそれをより効率的にするか、ヒープスペースを増やすことです。

于 2013-03-26T09:01:09.853 に答える
6

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

JVMは、内部的に何らかのアルゴリズムを使用して、この呼び出しをいつ行うかを決定します。System.gc()を使用して呼び出しを行う場合、それはJVMへの単なる要求であり、JVMはいつでもそれを無視することを決定できます。

于 2013-03-26T08:57:20.977 に答える
3

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

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

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

于 2013-03-26T08:55:10.400 に答える
2

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

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

于 2013-03-26T08:56:14.637 に答える