分析JVM虛擬機器棧的棧幀結構

2021-08-16 02:41:43 字數 739 閱讀 4016

1.先說虛擬機器棧:

虛擬機器棧是位於虛擬機器記憶體中的一片記憶體區域,它是執行緒私有的(乙個執行緒分配乙個虛擬機器棧空間)。它用來儲存棧幀,乙個棧幀就對應著乙個方法。棧幀的出棧和入棧對應著方法的結束和呼叫的開始。

2.再說棧幀

乙個完整的棧幀儲存著以下資訊:區域性變數表,運算元棧,棧幀資訊三大部分,下面我們依次解析這三個部分。

2.1區域性變數表:

區域性變數表儲存著方法的引數和區域性變數。這些表項可以是基本型別資料和引用資料型別,特別要注意的是引用資料型別:乙個引用型別資訊應該能做到兩點:1)通過這個引用找到這個引用物件在堆中資料存放的起始位址入口(即物件在記憶體中的實體地址)。2)通過這個引用能夠找到物件的實際型別在方法去中的型別資訊(儲存著類變數以及方法等)。

2.2運算元棧

用來執行方法中的具體**,如:計算,賦值,判斷等等操作。【個人看來運算元棧更像是一種輔助工具,用來儲存中間的操作結果】

2.3棧幀資訊

方法本身的符號引用:指向方法區中執行時常量池中的該方法的入口位址。如果這個方法是非虛方法,那麼這個符號引用在編譯時就轉化為直接引用,如果這個符號引用是乙個虛方法,那麼會在方法呼叫的時候動態鏈結到對應的方法。

附加資訊:一些除錯資訊或者其他的附加資訊。

3.最後說虛擬機器棧如何插入與消除棧幀:

方法呼叫在乙個執行緒中採用的是責任鏈機制,每當呼叫乙個方法的時候會就會向當前棧幀中插入該方法對應的棧幀,只有棧頂的方法是當前執行緒有效的(即正在執行的)。方法退出的時候,會返回到上一層棧幀繼續程式的執行。

虛擬機器棧相關的問題

q 舉例棧溢位的情況?stackoverflowerror a 遞迴呼叫等,通過 xss設定棧的大小 q 調整棧的大小,就能保證不出現溢位麼?q 分配的棧記憶體越大越好麼?q 垃圾 是否會涉及到虛擬機器棧?a 不會 記憶體區塊 error gc 程式計數器無無 本地方法棧有無 虛擬機器棧有無 堆區有...

棧幀的結構

區域性變數 當前方法的區域性變數 基本資料型別存值,引用資料型別存位址 資料槽 slot 專門對應於我們儲存資料的位元組 乙個資料槽4個位元組,所有基本資料型別和引用資料型別基本上都是占用乙個槽,只有double和long占用兩個槽,為了 的快速分配 一般情況下非靜態方法的第乙個位置存放的是當前物件...

JVM虛擬機器的學習筆記六(可達性分析)

這個演算法的基本思路就是通過一系列稱為 gc roots 的根物件作為起始節點集,從這些節點開始,根據引用關係向下搜尋,搜尋過程所走過的路徑稱為 引用鏈 reference chain 如果某個物件到gc roots間沒有任何引用鏈相連,或者用圖論的話來說就是從gc roots到這個物件不可達時,則...