[解決済み] Javaでは、静的メソッドと静的変数はどこに格納されているのですか?
質問
例えば
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の変更は確認していませんので、私は 推測 は、そのバージョンではまだ真実であると思いますが、ここでは確信が持てません。
関連
-
[解決済み] JVM起動時のパラメータ「-Xms」「-Xmx」とは何ですか?
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] Javaで配列を宣言し、初期化する方法は?
-
[解決済み] Java内部クラスと静的ネストされたクラス
-
[解決済み] 整数の平方根が整数であるかどうかを判断する最速の方法
-
[解決済み] Javaで数値を小数点以下n桁に丸める方法
-
[解決済み] 静的変数が悪とされるのはなぜですか?
-
[解決済み] Javaインターフェースでスタティックメソッドを定義できないのはなぜですか?
-
[解決済み】サーブレットはどのように動作するのですか?インスタンス化、セッション、共有変数とマルチスレッド
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
アクセス制限について アプリケーションの種類がAPIでない(必要なライブラリの制限)。
-
SpringBootApplication を型解決できない。
-
Enumとの組み合わせでswitchの使い方を一度覚えるために必要な定数式
-
Spring boot runs with Error creating bean with name 'entityManagerFactory' defined in class path resource
-
Spring BootのテストメソッドFailed to load ApplicationContextの問題を解決する
-
node js npm gruntインストール、elasticsearch-head 5.Xインストール
-
IDEA パッケージステートメントの欠落
-
[解決済み] 静的クラスとシングルトンパターンの違い?
-
[解決済み] Javaヒープ用語:若い世代、古い世代、永久世代?
-
[解決済み】JDK 8におけるPermGenの排除について