5

たとえば、私はそのようなコード

...メモリを取得し、そのメモリへのすべてのポインタを失うため、System.gc(); それを集めることができます。

System.gc();を呼び出します。

他のいくつかのタスクを実行します。


これが「他のタスクを実行する」ことです。および「System.gc();」並列で動作するか、「他のタスクを実行する」。「System.gc();」を待機します 処刑される

ありがとうございました

4

9 に答える 9

7

おそらくSystem.gc()を使用するべきではありません。C / C ++ユーザーがJavaにやってくるというよくある誤解は、仮想マシンがガベージコレクションを実行できるタイミングを仮想マシンに通知する必要があると考えていることです。現実には、ガベージコレクターは高度に最適化されており、最適であると判断したときに、このタスクを単独で実行します。通常、System.gc()を呼び出すことはお勧めしません。

ただし、System.gc()を呼び出すと、ガベージコレクションを実行するようにシステムに「推奨」されます。通常は実行しますが、実際には収集を実行しない場合があります。別のスレッドで実行されるかどうかは、実際の収集アルゴリズムによって異なります。デフォルトのものは、実行中にすべてをブロックします。そのため、別々のスレッドで実行される場合がありますが、実行すると現在の実行がブロックされます。

于 2010-04-19T12:24:26.367 に答える
6

ここでの正確な動作は、JVM の実装に完全に依存します。仕様では (これは、適切な JVM 実装が提供する必要があるものです)、並行して発生する可能性があり、コードが実行される前に最初に発生する可能性もあれば、まったく発生しない可能性もあります。

実際に、私がたまたま観察した JVM についての観察では、別のスレッドですぐに実行されるということです。ただし、場合によっては、複数の呼び出しによって複数のスレッドが生成され、1 つのスレッドで要求がキューに入れられることがあります。起動されたガベージ コレクションは、常に「ストップ ザ ワールド」タイプでした (つまり、非常に完成度が高く、アプリケーションの速度が低下または一時停止しました)。

ただし、@Chris Dail へのコメントを考えると、根本的な問題は System.gc() 呼び出しの動作ではありません。System.gc() の呼び出しにはいくつかの用途があります。クリア メモリを使用できるため、現在アプリケーションのフットプリントが実際にどれだけ大きいかを把握できます。また、クリアするメモリが少ないため、「世界を停止」する時間が短くなるように、世界を停止するガベージ コレクションを早期に実行するための戦略としても使用できます。(JVM がますます洗練されるにつれて、この種のことはますます必要ではなくなり、実際には逆効果になることに注意してください)。

ただし、OutOfMemoryError を解決することはできません。JVM は、最大限のガベージ コレクションが行われるまで OutOfMemoryError を返しません。System.gc を呼び出しても、それは変わりません。OutOfMemoryError がある場合は、実際には必要のない方法でオブジェクトへの参照を保持している可能性がありますが、それらのオブジェクトのメモリが再利用されるのを妨げています。

于 2010-04-19T13:04:43.920 に答える
4

通常は同期ですが、保証されていません。

実際には、JVMが意味があるかどうか、およびどのような種類のガベージコレクションを使用するかを決定するため、コレクションが効果的に行われることは保証されません。

追加情報が必要な場合は、-verbosegcフラグを使用してプログラムを起動できます。

いずれにせよ、ガベージコレクションは、指定された呼び出しなしにJVMによって自動的に発行されるものです。呼び出しSystem.gc()は、コレクションを開始する可能性があることを知らせるためのヒントにすぎません。

于 2010-04-19T12:25:41.473 に答える
1

ガベージ コレクションの実行方法は、JVM の実装次第です。通常の実装では、すべてのスレッドを停止してグローバルにメモリを収集し、1 つのスレッドのみを停止してこのスレッドのローカル メモリを収集します。Sunからのガベージ コレクションの詳細については、この古いが優れた記事を参照してください。

于 2010-04-19T12:26:52.113 に答える
1

Eric Eijkelenboomが指摘したように、このメソッドを呼び出しても、ガベージ コレクターがすぐに実行されるわけではありません。実際、それがまったく呼び出されるかどうかはわかりません...

あなたの場合 ( Amarghoshの回答に関するコメントから判断すると)、大量の RAM を必要とする何かを行う前に、メモリを解放する必要があります。その場合、心配する必要はありません。ガベージ コレクションに十分なメモリがある場合は、ガベージ コレクションを割り当てようとすると自動的に行われます。

于 2010-04-19T12:28:04.743 に答える
0

「他のタスクを実行する」はSystem.gc()、実行されて戻るのを待ちます。

于 2010-04-19T12:21:37.987 に答える
0

知る方法はありません。呼び出しSystem.gc()は、ガベージコレクションがその瞬間に実行されることを意味するのではなく、単にスケジュールされているだけです。適切なタイミングでガベージコレクションを実行するのはJVM次第です。

于 2010-04-19T12:23:17.253 に答える
0

Java 仕様によると、呼び出し System.gc()たスレッドは、GC が処理を完了するまで停止されます。これはヒントに過ぎないことに注意してください。JVM はこれを自由に無視できます。また、Sun の JVM には実際-XX:-DisableExplicitGCにその効果を示すコマンドライン スイッチ ( ) があります。このスイッチを使用すると、System.gc()何もせずにすぐに戻ります。

いずれにせよ、他のスレッドの実行を妨げる仕様はありません。これは GC アルゴリズムに依存します。Sun の JVM にはいくつかの機能が含まれており、そのうちのいくつかは、ほとんどの作業でアプリケーション スレッドと同時に実行できます。

他の人が指摘したように、System.gc()明示的に呼び出すことの最終的な効果は、ほとんどの場合、パフォーマンスを低下させることです。そのメソッドを呼び出す必要があると感じた場合は、何か間違ったことをしている可能性があります。

于 2010-04-19T15:22:58.923 に答える
0

javadoc はhttp://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#gc()に次のように伝えています。破棄されたすべてのオブジェクトからスペースを再利用するために最善を尽くします。

だから私は「他の仕事をしてください」と言います。「System.gc();」を待ちます 実行されます!

並列処理は使用されません。これは Java アプリケーションには適していません。実際、ガベージ コレクターを呼び出す/強制することは決して良い考えではありません。他に解決策がない極端な場合に備えておく必要があります...

さようなら、アルバン。

于 2010-04-19T12:28:39.233 に答える