如何理解《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:存储在堆中
如果是存储在堆中的话,何来高效一说?
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這個引用變量也不在了,但是堆內存中的那個實例依然在,如果沒有別的引用變數指向它,那麼它將在稍後被清除。
巴扎黑2017-04-18 10:54:21
是翻譯錯誤,譯文中用的是stack,即棧,而不是堆疊。以下是譯本:
特殊情況:原始型
您在程式設計中經常使用的一組類型會得到特殊對待。您可以將它們視為“原始”類型。進行特殊處理的原因是,用 new 建立物件(尤其是小而簡單的變數)效率不高,因為 new 將物件放置在堆上。對於這些類型,Java 依賴 C 和 C++ 所採用的方法。也就是說,不是使用 new 建立變量,而是創建一個不是引用的「自動」變數。變數直接保存值,並且放在棧上,所以效率更高