私のコードは次のとおりです。
class Test{
Test c=new Text();
System.out.println(c.size());
System.gc();
}
プログラマSystem.gc()
はJavaのガベージコレクションに使用できますか? 好ましいですか?JVM は自動的に実行しますSystem.gc()
。
私のコードは次のとおりです。
class Test{
Test c=new Text();
System.out.println(c.size());
System.gc();
}
プログラマSystem.gc()
はJavaのガベージコレクションに使用できますか? 好ましいですか?JVM は自動的に実行しますSystem.gc()
。
あなたはそれを呼び出すことができます。そのことに害はありません。しかし、期待しているオブジェクトのメモリがすぐに解放されるかどうかは保証されていません。
さらに、JVM は GC を非同期で実行するため、それを駆動する必要はありません。JVM
メモリを解放するのに十分なほどインテリジェントです。
目的を知るだけで問題ありません。何らかの理由でメモリをクリアすることを本当に考えている場合はXYZ
、間違いなくプログラム構造に設計上の欠陥があります。
System.gc()
収集サイクルを実行するように GC に要求を送信します。このリクエストは処理されるか、無視される可能性があるため、どちらの結果にも依存しないでください。
ガベージ コレクション サイクルは、通常、新しいオブジェクトの割り当てを担当するジェネレーションがいっぱいになるか、割り当て要求がまったく満たされない場合に、自動的に発生します (ユーザーの操作は必要ありません)。
ほとんどの場合、System.gc()
コード内で呼び出す必要はまったくありません。System.gc()
次のような条件が適用されるいくつかのケースで使用する必要があります。
呼び出すことはできますが、メモリが解放される保証はありません。さらに、メモリが解放された場合、プログラムの実行に悪影響を与える可能性があります。私はあなたにそれを説明しようとしますが、私の英語があまり上手ではないことに気づきましたXD
Java ヒープ メモリは、オブジェクトの世代に基づいて 3 つのゾーンに分割されます。単純化しすぎ:若者、成人、老人。GC の呼び出しが発生すると、まず「若いゾーン」で未使用のオブジェクトをチェックし、それらを解放します。GC が「ヤング ゾーン」で十分なメモリを解放しない場合、GC は「アダルト ゾーン」を調べます。GC が「アダルト ゾーン」で十分なメモリを解放しない場合、GC は「古いゾーン」を調べます。各世代は、最後の世代よりも GC による検査にコストがかかります。
オブジェクトは最初にヤング ゾーンで作成されます。GC がヤング ゾーンで実行され、オブジェクトがまだ使用されている場合、そのオブジェクトはアダルト ゾーンに渡されます。大人の同上 -> 古いゾーン。GC の実行を呼び出すと、若いオブジェクトがアダルト オブジェクトの候補であると見なされ、アダルト ゾーンに移動されます。これにより、大人のゾーンが不必要に成長します。後で GC がアダルト ゾーンを検査する必要がある場合、操作のコストが高くなり、プログラムのパフォーマンスが低下する可能性があります。