-1

私のコードは次のとおりです。

class Test{
    Test c=new Text();
    System.out.println(c.size());
    System.gc();
}

プログラマSystem.gc()はJavaのガベージコレクションに使用できますか? 好ましいですか?JVM は自動的に実行しますSystem.gc()

4

4 に答える 4

2

あなたはそれを呼び出すことができます。そのことに害はありません。しかし、期待しているオブジェクトのメモリがすぐに解放されるかどうかは保証されていません。

さらに、JVM は GC を非同期で実行するため、それを駆動する必要はありません。JVMメモリを解放するのに十分なほどインテリジェントです。

目的を知るだけで問題ありません。何らかの理由でメモリをクリアすることを本当に考えている場合はXYZ 、間違いなくプログラム構造に設計上の欠陥があります。

于 2013-10-11T10:41:00.357 に答える
2

System.gc()収集サイクルを実行するように GC に要求を送信します。このリクエストは処理されるか、無視される可能性があるため、どちらの結果にも依存しないでください。

ガベージ コレクション サイクルは、通常、新しいオブジェクトの割り当てを担当するジェネレーションがいっぱいになるか、割り当て要求がまったく満たされない場合に、自動的に発生します (ユーザーの操作は必要ありません)。

ほとんどの場合、System.gc()コード内で呼び出す必要はまったくありません。System.gc()次のような条件が適用されるいくつかのケースで使用する必要があります。

  • 大量のメモリが到達不能になっていることがわかります。
  • この量のメモリをすばやく解放することが不可欠です。
    • または、GC サイクルができるだけ遅く発生する (またはまったく発生しない) タイム クリティカルな状態にプログラムが入ろうとしている場合、その状態に入る前に GC サイクルを実行すると役立ちます。
  • ターゲット環境の GC がどのように機能するかについて、少なくとも大まかな考えがあります。
  • その時点で、その GC の戦略がシナリオに最適ではないことを確認しました。
于 2013-10-11T10:55:19.657 に答える
1

呼び出すことはできますが、メモリが解放される保証はありません。さらに、メモリが解放された場合、プログラムの実行に悪影響を与える可能性があります。私はあなたにそれを説明しようとしますが、私の英語があまり上手ではないことに気づきましたXD

Java ヒープ メモリは、オブジェクトの世代に基づいて 3 つのゾーンに分割されます。単純化しすぎ:若者、成人、老人。GC の呼び出しが発生すると、まず「若いゾーン」で未使用のオブジェクトをチェックし、それらを解放します。GC が「ヤング ゾーン」で十分なメモリを解放しない場合、GC は「アダルト ゾーン」を調べます。GC が「アダルト ゾーン」で十分なメモリを解放しない場合、GC は「古いゾーン」を調べます。各世代は、最後の世代よりも GC による検査にコストがかかります。

オブジェクトは最初にヤング ゾーンで作成されます。GC がヤング ゾーンで実行され、オブジェクトがまだ使用されている場合、そのオブジェクトはアダルト ゾーンに渡されます。大人の同上 -> 古いゾーン。GC の実行を呼び出すと、若いオブジェクトがアダルト オブジェクトの候補であると見なされ、アダルト ゾーンに移動されます。これにより、大人のゾーンが不必要に成長します。後で GC がアダルト ゾーンを検査する必要がある場合、操作のコストが高くなり、プログラムのパフォーマンスが低下する可能性があります。

于 2013-10-11T11:02:00.997 に答える