1. ホーム
  2. java

[解決済み] Javaでは、静的メソッドと静的変数はどこに格納されているのですか?

2022-06-18 11:43:31

質問

例えば

class A {
    static int i=0;
    static int j;

   static void method() {
       // static k=0; can't use static for local variables only final is permitted
       // static int L;
    }
}

これらの変数はJavaのどこに格納されるのでしょうか、ヒープやスタックメモリに格納されるのでしょうか。どのように格納されるのでしょうか?

どのように解決するのですか?

静的メソッド(実際にはすべてのメソッド)は、静的変数と同じように PermGen セクションに格納されます。なぜなら、それらはリフレクションデータ(インスタンス関連ではなく、クラス関連のデータ)の一部だからです。Java 8のPermGenはMetaSpaceに取って代わられ、以下のようになりました。 JEP 122 によって、静的フィールドがヒープに格納されている間、メタデータを保持するだけです。

これは主にOracleのHotspot JVMとそれに基づいた他のものに適用されることに注意してください。しかし、すべてのJVMがPermGenやMetaspaceのような Eclipse OpenJ9 .

明確化のための更新 :

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() は一度だけ実行されるので、例外を投げたり、オブジェクトの収集を 妨げたりしないようにしなければなりません。もし、何らかの例外によってファイナライズを停止させると finalize() は同じオブジェクトに対して二度目は起動されません。

最後の注意点 つまり、HotSpotはJRockitと異なる方法でそれを行うかもしれませんし、これは同じJVMのバージョン間でさえ異なるかもしれません。上記は、回答時にほとんどの人がこれらのJVMを使用していたと思われるため、Java 5と6用のHotSpot(これらは基本的に同じです)をベースにしています。Java 8の時点でメモリモデルに大きな変更があったため、Java 8 HotSpotでは上記の記述は正しくないかもしれません - また、Java 7 HotSpotの変更は確認していませんので、私は 推測 は、そのバージョンではまだ真実であると思いますが、ここでは確信が持てません。