首頁  >  問答  >  主體

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

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

黄舟黄舟2743 天前541

全部回覆(4)我來回復

  • PHPz

    PHPz2017-04-18 10:54:21

    我們不能一概而論的說,基本型態資料都是放在堆疊中的!當某個 類別實例 中具有基本型別時,基本型別就放在堆中!

    回覆
    0
  • PHP中文网

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

    記憶體分為堆和棧,這你已經知道了。

    堆記憶體是屬於JVM的,棧記憶體是屬於方法的,方法結束了,棧記憶體也就沒了。

    程式運行main函數時,有一個堆內存,一個main的棧內存

    int var3 = 0;
    這個var3,是放在main函數的棧記憶體中的,是一個值。

    之後
    demo obj1 = new demo();
    main函數的棧內存中有了一個引用變量,obj1,指向了堆內存中new出來的這個實例。

    我們再看堆記憶體中的這個實例,他有2個字段,他們都是存放在堆中的。

    等到main函數運行結束時,假如還有別的線程在運行,JVM還沒結束,此時,main函數的棧內存被清除,var3,不在了,obj1這個引用變量也不在了,但是堆內存中的那個實例依然在,如果沒有別的引用變數指向它,那麼它將在稍後被清除。

    回覆
    0
  • 巴扎黑

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

    是翻譯錯誤,譯文中用的是stack,即棧,而不是堆疊。以下是譯本:

    特殊情況:原始型

    您在程式設計中經常使用的一組類型會得到特殊對待。您可以將它們視為“原始”類型。進行特殊處理的原因是,用 new 建立物件(尤其是小而簡單的變數)效率不高,因為 new 將物件放置在堆上。對於這些類型,Java 依賴 C 和 C++ 所採用的方法。也就是說,不是使用 new 建立變量,而是創建一個不是引用的「自動」變數。變數直接保存值,並且放在上,所以效率更高

    回覆
    0
  • 巴扎黑

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

    p22,堆疊指的是stack,堆指的是heap

    回覆
    0
  • 取消回覆