java 基本數(shù)據(jù)類型各種情況下在內(nèi)存中存儲位置?
問題描述
問題:如何理解《Java編程思想-第四版》P23 中,這個變量直接存儲“值”,并置于堆棧中,因此更加高效一句中的 “堆棧” 兩字,到底是堆還是棧?情況如下:
class demo { private int var1; // 字段1 private Integer var2; // 字段2 public static void main(String[] args) {int var3 = 0; // 變量1demo obj1 = new demo(); // 實(shí)例1 }}我的理解
參考《Java編程思想-第四版》P23 和 《深入理解Java虛擬機(jī):JVM高級特性與最佳實(shí)踐 第2版》P39-P43,對于該 demo
實(shí)例1:存儲在堆內(nèi)存中
變量1:存儲在方法棧中
實(shí)例1中的字段1:存儲在堆中
實(shí)例1中的字段2:存儲在堆中
如果是存儲在堆中的話,何來高效一說?
問題解答
回答1:我們不能一概而論的說,基本類型數(shù)據(jù)都是放在棧中的!當(dāng)某個 類實(shí)例 中具有基本類型時,基本類型就放在堆中!
回答2:內(nèi)存分為堆和棧,這你已經(jīng)知道了。
堆內(nèi)存是屬于JVM的,棧內(nèi)存是屬于方法的,方法結(jié)束了,棧內(nèi)存也就沒了。
程序運(yùn)行main函數(shù)時,有一個堆內(nèi)存,一個main的棧內(nèi)存
int var3 = 0;這個var3,是放在main函數(shù)的棧內(nèi)存中的,是一個值。
之后demo obj1 = new demo();main函數(shù)的棧內(nèi)存中有了一個引用變量,obj1,指向了堆內(nèi)存中new出來的這個實(shí)例。
我們再看堆內(nèi)存中的這個實(shí)例,他有2個字段,他們都是存放在堆中的。
等到main函數(shù)運(yùn)行結(jié)束時,假如還有別的線程在運(yùn)行,JVM還沒有結(jié)束,此時,main函數(shù)的棧內(nèi)存被清除,var3,不在了,obj1這個引用變量也不在了,但是堆內(nèi)存中的那個實(shí)例依然在,如果沒有別的引用變量 指向它 ,那么它將在稍后被清除。
回答3:是翻譯錯誤,原文中用的是stack,即棧,而不是堆棧。以下是原文:
Special case: primitive typesOne group of types, which you’ll use quite often in your programming, gets special treatment. You can think of these as “primitive” types. The reason for the special treatment is that to create an object with new—especially a small, simple variable—isn’t very efficient, because new places objects on the heap. For these types Java falls back on the approach taken by C and C++. That is, instead of creating the variable by using new, an “automatic” variable is created that is not a reference. The variable holds the value directly, and it’s placed on the stack, so it’s much more efficient.
回答4:p22,堆棧指的是stack,堆指的是heap
相關(guān)文章:
1. docker不顯示端口映射呢?2. dockerfile - 我用docker build的時候出現(xiàn)下邊問題 麻煩幫我看一下3. angular.js - node.js中下載的angulae無法引入4. docker-compose中volumes的問題5. php - 想要遠(yuǎn)程推送emjio ios端怎么搞 需要怎么配合6. docker 下面創(chuàng)建的IMAGE 他們的 ID 一樣?這個是怎么回事????7. android - 添加multidex后在部分機(jī)型上產(chǎn)生anr的問題,該如何解決8. 一個走錯路的23歲傻小子的提問9. mysql - 數(shù)據(jù)庫如何存儲小說數(shù)據(jù)比較好?10. mysql里的大表用mycat做水平拆分,是不是要先手動分好,再配置mycat
