4、JVM 調優 - 棧

1、虛擬機棧結構示意圖:

 

2、棧幀結構示意圖:

 

1、“堆和棧”中存放局部變量的棧(和存放對象的堆),但是不僅僅存放局部變量,存放局部變量的只是裏面的變量表部分。

2、棧針是方法執行產生的內存,每一個方法會創建一個棧幀,用於存儲局部變量表、操作棧、動態鏈接、方法出口等信息。

  • 局部變量表存放了編譯器可知基本數據類型(boolean、byte、char、short、int、float、long、double)和引用所指向的地址(這個地址可能是對象的地址,也可能是對象地址所在的地址(句柄),也可能是指令的地址)

注意:string類型的值沒有存放在這裏。這裏存放的只是指向堆中或者方法區常量池的地址。

  • 局部變量表的內存大小,在編譯期就能確定,在方法執行時,內存分配後,就不會改變。

3、每一個方法從被調用到執行完成,就是一個棧幀在虛擬機棧中從入棧到出棧的過程。

4、虛擬機棧也是線程獨立的。也就是每個線程有自己的棧幀。

5、虛擬機棧可能出現的兩種異常:棧溢出和內存溢出。

  • 如果線程請求的棧深度大於虛擬機所允許的深度,將拋出StackOverflowError異常(如:將一個函數反覆遞歸自己,最終會出現這種異常)。
  • 如果JVM棧可以動態擴展(大部分JVM是可以的),當擴展時無法申請到足夠內存則拋出OutOfMemoryError異常。

3、本地方法棧

(1)本地方法棧與虛擬機棧所發揮的作用很相似,他們的區別在於虛擬機棧爲執行Java代碼方法服務,而本地方法棧是爲Native方法服務(也就第3方的:c/c++等)。

(2)和JVM棧一樣,這個區域也會拋出StackOverflowError和OutOfMemoryError異常。

(3)甚至有的虛擬機(譬如Sun HotSpot虛擬機)直接就把本地方法棧和虛擬機棧合二爲一。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章