2

これは私が心に抱いていた疑いであり、それを完全に打ち砕こうと考えました.
アプリケーションの一部としてロードされる次のクラスがあるとします。

class HeavyClass {
    static final ArrayList list = new ArrayList(100);
}

HeavyClass のインスタンスに何が起こるかに関係なく、静的メンバーのライフサイクルはアプリケーションに合わせて調整されますか。
静的がガベージ コレクションされていないクラスローダー メモリ (permgen) に合わせられている場合 - そのようなオブジェクトが必要に応じてのみ消費 (およびメンバーのクリーンアップ) することを確認するためのプログラミング イディオムは何ですか?すべてのインスタンスで共有されます)

4

2 に答える 2

6

静的変数は、クラス オブジェクトの存続期間中存在します。つまり、クラスがロードされたときに作成され、通常は ClassLoader が破棄されたときにのみ終了します。

リストをインスタンスにアタッチする場合は、HeavyClass作成しないでください。メソッドをstatic呼び出すlist.clear()と、finalizeが得られますunpredictable results

Java 言語仕様を参照

8.3.1.1. 静的フィールド

フィールドが静的であると宣言されている場合、クラスのインスタンスが最終的にいくつ (場合によってはゼロ) 作成されても、フィールドの具体化は 1 つだけ存在します。クラス変数と呼ばれることもある静的フィールドは、クラスが初期化されるときに具体化されます (§12.4)。

于 2013-05-27T03:21:33.530 に答える