静的フィールドのガベージ コレクション
静的フィールドが参照されなくなった場合の運命についてよくある質問が生じます。プログラムのセットアップを目的とした次のユーティリティ クラスを考えてみましょう:
class MyUtils { private static MyObject myObject = new MyObject(); /*package*/static boolean doStuff(Params... params) { // do stuff with myObject and params... } }
myObject フィールドは、使用されなくなったらガベージ コレクションされますか? それともプログラムの実行中ずっと保持されますか?
Toこれに答えるには、静的変数の性質を理解する必要があります。静的変数はクラスのロード時にメモリが割り当てられ、クラスの存続期間中存在します。クラスがロードされている限り、ガベージ コレクターはそれらを再利用できません。
Java 言語仕様 (JLS) セクション 12.7 によると、
A class or interface may be unloaded if and only if its defining class loader may be reclaimed by the garbage collector [...] Classes and interfaces loaded by the bootstrap loader may not be unloaded.
したがって、ロードされたクラスの静的変数は再利用できません。対応するクラス ローダー自体が収集されるまで、ガベージ コレクションが行われます。ブートストラップ クラスはアンロードできないため、これらのクラスの静的変数は無期限に存続します。
MyUtils の場合、ブートストラップ クラス ローダーによってロードされないため、静的 myObject フィールドはプログラムの実行後にガベージ コレクションされる可能性があります。 MyUtils が使用されているかどうかに関係なく、必要なくなりました。
以上が静的フィールドは参照されなくなったらガベージ コレクションされますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。