検索

ホームページ  >  に質問  >  本文

java 基本数据类型各种情况下在内存中存储位置?

问题:

如何理解《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

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

黄舟黄舟2803日前585

全員に返信(4)返信します

  • PHPz

    PHPz2017-04-18 10:54:21

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

    返事
    0
  • PHP中文网

    PHP中文网2017-04-18 10:54:21

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

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

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

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

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

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

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

    返事
    0
  • 巴扎黑

    巴扎黑2017-04-18 10:54:21

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

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

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

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

    返事
    0
  • 巴扎黑

    巴扎黑2017-04-18 10:54:21

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

    返事
    0
  • キャンセル返事