java 基本数据类型各种情况下在内存中存储位置?
黄舟
黄舟 2017-04-18 10:52:21
0
4
580

问题:

如何理解《Java编程思想-第四版》P23 中,这个变量直接存储“值”,并置于堆栈中,因此更加高效
一句中的 “堆栈” 两字,到底是堆还是栈?情况如下:

class demo {
    private int var1; // 字段1
    private Integer var2; // 字段2

    public static void main(String[] args) {
        int var3 = 0; // 变量1

        demo obj1 = new demo(); // 实例1
    }
}

我的理解

参考《Java编程思想-第四版》P23 和 《深入理解Java虚拟机:JVM高级特性与最佳实践 第2版》P39-P43,对于该 demo

  • 实例1:存储在堆内存中

  • 变量1:存储在方法栈中

  • 实例1中的字段1:存储在堆中

  • 实例1中的字段2:存储在堆中

如果是存储在堆中的话,何来高效一说?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全員に返信(4)
PHPzhong

すべての基本的なタイプのデータがスタックに配置されると一般化して言うことはできません。 クラス インスタンスがプリミティブ型を持つ場合、そのプリミティブ型はヒープに配置されます!

いいねを押す +0
Ty80

メモリはヒープとスタックに分割されます。これはすでにご存知でしょう。

ヒープメモリはJVMに属し、スタックメモリはメソッドに属します。メソッドが終了すると、スタックメモリはなくなります。

プログラムがメイン関数を実行すると、ヒープメモリとメインスタックメモリが存在します

int var3 = 0;
この var3 は main 関数のスタック メモリに配置される値です。

demo obj1 = new Demon(); の後
main 関数のスタック メモリ内に、ヒープ メモリ内の新しいインスタンスを指す参照変数 obj1 があります。

ヒープ メモリ内のこのインスタンスをもう一度見てみましょう。このインスタンスには 2 つのフィールドがあり、両方ともヒープに保存されています。

main 関数が終了するとき、他のスレッドが実行されている場合、JVM はまだ終了していません。main 関数のスタック メモリはクリアされ、var3 は存在せず、参照変数 obj1 も存在しません。ですが、ヒープ メモリ内には のインスタンスがまだ存在しており、他の参照変数がそれを指していなければ、後でクリアされます。

いいねを押す +0
巴扎黑

は翻訳文であり、原文では stack、つまり、スタックではなく、 が使用されます。

特殊なケース: プリミティブ型

プログラミングで頻繁に使用するタイプの 1 つのグループが特別に扱われます。これらは「プリミティブ」タイプと考えることができます。特別な処理を行う理由は、new を使用してオブジェクトを作成する (特に小さくて単純な変数) と、new がオブジェクトをヒープ上に配置するため、あまり効率的ではないためです。これらの型の場合、Java は C および C++ が採用するアプローチを利用します。つまり、new を使用して変数を作成する代わりに、参照ではない「自動」変数が作成されます。変数は値を直接保持し、

スタックに配置されるため、はるかに効率的です。

いいねを押す +0
巴扎黑

p22、スタックはスタックを指し、ヒープはヒープを指します

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート