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

问题:

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

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

Ty80

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

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

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

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

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

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

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

巴扎黑

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

特殊情況:原始型

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

巴扎黑

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

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板