3
class StaticTest{

public static SomeClass statVar = new SomeClass();

}

この後、いくつかの新しいオブジェクトにランダムにアクセスStaticTest.statVarして割り当てると、これらすべてのオブジェクトがいつガベージ コレクションされるのでしょうか? 回答: 通常のガベージ コレクション時間です。

しかし、これstatVarがいくつかのインスタンス変数 (オブジェクト) への参照を持っている場合はどうなるでしょうか?

明確ではありません?

OK、静的変数の寿命はクラスがアンロードされるまでです。Web アプリケーションでは、多くのことを静的コンテキストで初期化しています。この静的コンテキストにいくつかのオブジェクト参照を提供しているが、それらを解放していない場合、ガベージ コレクションはどのように行われるのでしょうか?

これについて議論できれば幸いです。

4

3 に答える 3

5

静的変数によって参照されるオブジェクトは、クラスのアンロード時にガベージ コレクションされます。そのため、静的参照によって参照されているオブジェクトは、クラスがアンロードされるまで GC されません (ヒープ内のオブジェクトへの到達可能な参照が常に存在するため)。

于 2012-08-10T19:52:41.010 に答える
0

変数ではなく、メモリ内のオブジェクトについて考えてください。statVarメモリ内のオブジェクトへの参照です。同じオブジェクトへの参照を別の場所に保持している場合、その参照が解放されるまでオブジェクトは GC されません。クラスがアンロードされて消えるかどうかは問題ではありません。これはstatVar、まだ参照が生きている Object への別の参照であるためです。したがって、その場合はクリーニングされません。

于 2012-08-10T19:57:20.327 に答える
0

通常、静的オブジェクト参照は GC ルートと見なされ、それらが指すもの (およびそれらのオブジェクトによって結び付けられているもの) はすべてライブと見なされます。それらが参照するオブジェクトをガベージコレクションの対象にしたい場合は、それらへの参照をクリアする必要があります(もちろん、他のすべての参照も)。

クラスが参照されなくなり、 JVM が未使用のクラスを収集するように設定されている場合は、thinksteep の回答が適用されます。私はその瞬間を待って息を止めませんでした。

参照されているデータを保持している限り、答えは単にクリアされないということです。これは、GC を使用する場合のプロトコルの最も基本的な部分です。

補足として、それがシングルトンオブジェクトまたはそのWebアプリのすべてのユーザーによって共有されるものでない限り、Webアプリの静的コンテキストに物事を保持することはほとんど良い考えではないと思います. その場合、アプリサーバーが実行されている限り、なぜそれをクリーンアップしたいのでしょうか? 意味がありません。

于 2012-08-10T20:02:11.323 に答える