我知道區域變數是存放在堆疊區的,但是實體變數(包括primitive主資料型別)存放在哪呢,堆疊區?還是堆區?,那參考變數呢?求大神指教一下!!
uj5u.com熱心網友回復:
物件都放在堆上,堆疊保存基本型別的值、物件的參考(可以理解為物件在堆上的地址)。uj5u.com熱心網友回復:
所有的實體變數,參考變數等等都在堆疊記憶體中(不管是實體還是參考存的的都是物件對應的地址,而不是物件本身).物件本身以及物件的資料成員都在堆記憶體中.
uj5u.com熱心網友回復:
物件都在堆中,區域變數物件也在堆中,區域變數只是持有參考uj5u.com熱心網友回復:
物件本身是放在堆里面,參考在堆疊里面,堆疊的操作實際上是方法的呼叫,對應著堆疊幀入堆疊和出堆疊uj5u.com熱心網友回復:
參考型別的變數也可以是區域變數,區域變數保存在堆疊區,可它所參考的物件保存在堆中或者常量池中。一個物件中的成員變數,也就是你說的實體變數,跟物件在一起,物件在堆中,那么它也在堆中。
uj5u.com熱心網友回復:
我覺得你說的是對的,現在這個問題有好多誤導啊uj5u.com熱心網友回復:
推薦閱讀《深入理解java虛擬機》周志明uj5u.com熱心網友回復:
實體變數放堆區uj5u.com熱心網友回復:
不建議新人在很多常用語法語意都不熟悉的時候深入這個話題。討論這個問題之前,需要先想清楚另一個問題:堆疊和堆兩種結構各有什么特點?
在想明白這一點的基礎上,java為何把一些資料放在堆疊里,而一些資料放在堆里的問題更容易理解。
uj5u.com熱心網友回復:
堆疊的優勢是,存取速度比堆要快,僅次于直接位于CPU中的暫存器。但缺點是,存在堆疊中的資料大小與生存期必須是確定的,缺乏靈活性。
另外,堆疊資料在多個執行緒或者多個堆疊之間是不可以共享的,但是在堆疊內部多個值相等的變數是可以指向一個地址的。
堆的優勢是可以動態地分配記憶體大小,生存期也不必事先告訴編譯器,Java的垃圾收集器會自動收走這些不再使用的資料。
但缺點是,由于要在運行時動態分配記憶體,存取速度較慢。
uj5u.com熱心網友回復:
程式執行程序
1.當程式開始運行的時候,將自己Load到記憶體區
2.此時作業系統也有一些代碼在記憶體中,所以作業系統代碼會找到該程式代碼區的main方法并開始執行。
3.執行程序中的記憶體管理分為四部分:
code segment:代碼區,用于存放代碼。程式運行時將代碼load到該區域。
datasegment:用于存放靜態變數,字串常量。
stack:堆疊,用于存放區域變數。1.用來保存基本資料型別的值;2.保存類的實體,即堆區物件的參考(指標)。也可以用來保存加載方法時的幀。
heap:堆,用來動態生成記憶體,存放new出來的東西。注意創建出來的物件只包含屬于各自的成員變數,并不包括成員方法。因為同一個類的物件擁有各自的成員變數,存盤在各自的堆中,但是他們共享該類的方法,并不是每創建一個物件就把成員方法復制一次。
uj5u.com熱心網友回復:
實體變數是放在堆上,具體參考《 Head First Java》構造器與垃圾收集器章節,關于堆疊問題里面講的很明白截圖如下
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/242494.html
標籤:Java SE
上一篇:java串口通信拒絕訪問
