ガベージ コレクションは、どの変数からも参照されなくなったオブジェクトを特定し、そのオブジェクトが占有していたメモリを解放します。
このプロセスが定期的に行われるのか、オブジェクトの参照カウントがゼロになった直後に行われるのかはわかりません。
オブジェクトの参照カウントがゼロになるたびに GC がすぐに機能する場合、System.GC(); を呼び出して GC を要求する必要がない場合、この場合、このメソッドの目的は何ですか?
ガベージ コレクションは、どの変数からも参照されなくなったオブジェクトを特定し、そのオブジェクトが占有していたメモリを解放します。
このプロセスが定期的に行われるのか、オブジェクトの参照カウントがゼロになった直後に行われるのかはわかりません。
オブジェクトの参照カウントがゼロになるたびに GC がすぐに機能する場合、System.GC(); を呼び出して GC を要求する必要がない場合、この場合、このメソッドの目的は何ですか?
GC は定期的に行われることも、オブジェクトの参照カウントがゼロになった直後に行われることもありません (注: ほとんどの JVM 実装は参照カウント アルゴリズムを使用しないため、この最後の点は意味がありません)。
GC がいつ実行されるかは、ガベージ コレクション アルゴリズムによって決定されます。
最新の JVM のほとんどは、"stop-the-world" ガベージ コレクターを使用します。これは、プログラム内のすべてのアプリケーション スレッドを停止し、ガベージ コレクションを実行してから、アプリケーション スレッドを再開するガベージ コレクターです。これは、ガベージ コレクションを実行する前に、アプリケーション内のすべてのスレッドがスレッドを安全に停止できるポイントに到達する必要があることを意味します。
これはガベージ コレクション アルゴリズムによって決定されます。ガベージ コレクションのリクエストを JVM に送信するために使用されるSystem.gc ()
やのようなメソッドもありますが、ガベージ コレクションが行われる保証はありません。Runtime.gc ()
を呼び出すときはSystem.gc()
、ガベージ コレクターにクリーンアップを行うように伝えます。GC
問題は、がリクエストにいつ応答するかが明確でないことです。さらに、GC
呼び出してもまったく実行されない可能性があります。Java では、がどのように機能するかを予測することはできませんGC
。Object
(そのため、クリーンアップ コードをのfinalize()
メソッドに入れるのは悪い習慣と見なされます)。ではJava
、参照されていないオブジェクトは自動的にガベージとして収集されます。そのため、電話する必要はありませんSystem.gc()
。特別な場合で、可能であれば実行したい場合は、このメソッドを使用することを試みることができますが、動作は保証されません。(上記のとおり)。
オブジェクトは、ライブ スレッドまたは静的参照から到達できない場合、ガベージ コレクションまたは GC の対象になります。つまり、すべての参照が null の場合、オブジェクトはガベージ コレクションの対象になると言えます。循環依存は参照としてカウントされないため、オブジェクト A にオブジェクト B の参照があり、オブジェクト B にオブジェクト A の参照があり、それらに他のライブ参照がない場合、オブジェクト A と B の両方がガベージ コレクションの対象になります。通常、オブジェクトは次の場合に Java でのガベージ コレクションの対象になります
。1) そのオブジェクトのすべての参照が明示的に null に設定されている場合 (例: object = null
) 2) オブジェクトがブロック内で作成され、コントロールがそのブロックを終了すると、参照がスコープ外になります。
3) null に設定された親オブジェクト。オブジェクトが別のオブジェクトの参照を保持している場合、コンテナ オブジェクトの参照を null に設定すると、子または含まれるオブジェクトが自動的にガベージ コレクションの対象になります。
4) オブジェクトに WeakHashMap によるライブ参照しかない場合、ガベージ コレクションの対象になります。
ガベージ コレクションのリクエストを JVM に送信するために使用される System.gc () や Runtime.gc () のようなメソッドがありますが、ガベージ コレクションが行われる保証はありません。
2 つの答えがあります。
ガベージ コレクタが実行される場合、JVM 仕様、JLS、またはその他の決定的な Java ドキュメントでは指定されていません。したがって、実装固有です。
実際には、いくつかの異なる戦略が一般的に使用されます。非同時コレクターの場合、未割り当て領域が十分にないために割り当ての試行が失敗すると、GC がトリガーされます。コンカレント コレクタの場合、空き領域の量が事前に定義されたしきい値を下回ると、コレクションが開始されます。(HotSpot 同時 GC の場合、しきい値比率は調整可能なパラメーターです。)
最新の Java GC は参照カウントを使用しません。
の目的はSystem.gc()
、アプリケーションが JVM に「今こそガベージ コレクタを実行するのに適した時期だ」というヒントを提供できるようにすることです。JVM はそのヒントを無視できます。原則として、そのように GC をトリガーすることは、CPU 使用率の点で非効率的です。本番コードでこれを行う唯一の正当な理由は、非常にインタラクティブなアプリケーションで GC の一時停止を回避する方法です。(ゲームの「レベル」間など、対話性が不要であることがわかっている時点で GC を強制しようとします。)