静的フィールドのガベージ コレクションについて
Java では、静的フィールドとは、クラス内で宣言されているが、特定のフィールドにバインドされていないフィールドです。実例。これらは、インスタンス間で共有データを維持したり、プログラム構成を容易にしたりするなど、さまざまなシナリオで重要な役割を果たします。ただし、一般的な疑問が生じます: 静的フィールドはいつガベージ コレクションされるのですか?
これに対処するために、仮想ユーティリティ クラス MyUtils の例を考えてみましょう:
class MyUtils { private static MyObject myObject = new MyObject(); /*package*/static boolean doStuff(Params... params) { // do stuff with myObject and params... } }
問題は、静的フィールド myObject は、使用されなくなったらガベージ コレクションの対象になりますか?
ガベージのルールCollection
この質問に答えるには、ガベージ コレクションのルールを理解することが重要です。 Java ヒープ内の他のオブジェクトと同様に、静的変数には次の一般的なガベージ コレクション ルールが適用されます。オブジェクトは、ライブ参照からアクセスできなくなったときにガベージ コレクションの対象となります。
Static Field例外
ただし、静的フィールドには重要な例外が存在します。アクティブなインスタンスからの参照によって静的フィールドに到達できなくなった場合でも、静的フィールドが属するクラスがまだロードされている間は、静的フィールドをガベージ コレクションの対象として選択することはできません。これは、クラスの特定のインスタンスが使用されているかどうかに関係なく、静的フィールドがいつでもアクセスできるためです。
クラス ローダーの役割
したがって、静的フィールドは、そのクラスをロードしたクラスローダーに関連付けられます。クラス ローダーがガベージ コレクターによって再利用されると、静的フィールドを保持するクラスを含む、そのクラス ローダーによってロードされたすべてのクラスのアンロードがトリガーされます。これにより、最終的に static フィールドがガベージ コレクションの対象になります。
クラスのアンロードの実際
クラスのアンロードは、Java 仮想マシン ( JVM) ですが、特定の状況で発生する可能性があります。たとえば、アプリケーションが動的クラス ロードを実行し、メモリ リソースを解放するために未使用のクラスをアンロードする場合に発生する可能性があります。
結論
要約すると、静的フィールドはガベージにすることはできません。属しているクラスのロード中に収集されます。これらは、それぞれのクラス ローダー自体がガベージとして収集される場合にのみ収集できます。この動作により、静的フィールドが宣言されているクラスが利用可能な限り、静的フィールドにアクセスできることが保証されます。
以上がJava の静的フィールドはいつガベージ コレクションされますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。