静的メソッド(実際にはすべてのメソッド)と静的変数はPermGen
、リフレクションデータ(インスタンス関連ではなくクラス関連のデータ)の一部であるため、ヒープのセクションに格納されます。
明確化のための更新:
変数とその技術値(プリミティブまたは参照)のみがPermGenスペースに格納されることに注意してください。
静的変数がオブジェクトへの参照である場合、そのオブジェクト自体はヒープの通常のセクション(若い/古い世代またはサバイバースペース)に格納されます。これらのオブジェクト(クラスなどの内部オブジェクトでない場合)は、PermGenスペースには格納されません。
例:
static int i = 1; //the value 1 is stored in the PermGen section
static Object o = new SomeObject(); //the reference(pointer/memory address) is stored in the PermGen section, the object itself is not.
ガベージコレクションに関する一言:
行う ではないに依存していますfinalize()
実行が保証されて。オブジェクトがガベージコレクションの対象である場合でも、ガベージコレクターをいつ実行し、何を収集するかは、JVMが決定します。
もちろん、静的変数をnullに設定して、ヒープ上のオブジェクトへの参照を削除することもできますが、これはガベージコレクターを意味するものではありません がそれを収集する(参照がなくなった場合でも)。
さらに finalize()
は1回だけ実行されるため、例外がスローされないようにするか、オブジェクトが収集されないようにする必要があります。なんらかの例外によってファイナライズを中止した場合finalize()
、同じオブジェクトで2回目に呼び出されることはありません。
最後の注記:コード、ランタイムデータなどがどのように格納されるかは、使用されるJVMによって異なります。つまり、HotSpotはJRockitとは異なる方法で実行し、同じJVMのバージョン間でも異なる場合があります。上記はHotSpot for Java 5と6(基本的には同じ)に基づいています。回答した時点では、ほとんどの人がこれらのJVMを使用していると思います。Java 8でのメモリモデルの大きな変更により、上記のステートメントはJava 8 HotSpotには当てはまらない可能性があります。Java7 HotSpotの変更を確認しなかったので、そのバージョンでも上記は当てはまると思います。しかし、ここではわかりません。