Java虛擬機堆棧
- 作者:新網
- 來源:新網
- 瀏覽:100
- 2018-05-15 14:33:53
棧(stack),位于通用RAM中,但通過它的“堆棧指針”可以從處理器哪里獲得支持。堆棧指針若向下移動,則分配新的內存;若向上移動,則釋放那些內存。存儲讀取速度,僅次于寄存器。存放基本類型數據變量和對象、數組等引用類型的引用!
棧(stack),位于通用RAM中,但通過它的“堆棧指針”可以從處理器哪里獲得支持。堆棧指針若向下移動,則分配新的內存;若向上移動,則釋放那些內存。存儲讀取速度,僅次于寄存器。存放基本類型數據變量和對象、數組等引用類型的引用!
<
div> 棧幀存儲了方法的局部變量表、操作數棧、動態連接和方法返回地址等信息。
每一個方法從調用開始到執行完成的過程,就對應著一個棧幀在
虛擬機棧里面從入棧到出棧(也叫彈棧)的過程。
對于棧,只有棧頂的棧幀是有效的,稱為當前棧幀,這個棧幀所關聯的方法稱為當前方法。執行引擎所運行的所有字節碼指令都只針對當前棧幀進行操作。
堆(heap),是一種通用性的內存池(也存在于RAM中),用于存放所有的JAVA對象!
各存儲
空間就速度來說,有如下關系:寄存器 >堆棧 > 堆 > 其它。
棧中的數據大小和生命周期是可以確定的,當沒有引用指向數據時,這個數據就會消失。堆中的對象的由垃圾回收器gc負責回收。
結合實例:Student student=new Student();JVM在內存中偷偷的做了什么?
加載Student.class文件進入內存
在棧內存中為student開辟空間,棧內存中的局部變量表中存放student變量
在堆內存中為學生對象開辟空間
學生對象的成員變量默認初始化(無參構造方法)
學生對象的成員變量顯示初始化(有參構造方法)(若沒有就不執行)
通過構造代碼塊對學生對象進行初始化(若沒有就不執行)
通過構造方法對學生對象進行初始化(通過構造方法對學生對象的成員變量賦值)
對象初始化完畢
學生對象初始化完畢后,向外拋出產生的對象地址
讓變量student指向學生對象。