(來源:極客學院JVM教程)
2.java虛擬機棧和本地方法棧
Menu
1>java虛擬機棧的概念和特徵
2>本地方法棧的概念和特徵
3>java虛擬機中存放的棧元素(棧幀)的概念和特徵
4>本地變量表和操作數棧
5>內存異常
1>java虛擬機棧的概念和特徵
java虛擬機棧描述的是java方法執行時候的內存概念模型
(每個方法執行的時候都會創建一個棧幀,用來存放這個方法的操作數棧,局部變量表,方法出口,動態鏈接等信息)
特徵:
.線程私有
.後進先出(LIFO)棧
.存儲棧幀,支撐java方法的調用執行和退出
.可能出現OutOfMemoryError異常和StackOverflowError異常
區別: java虛擬機是爲了執行java字節碼文件所服務的
本地方法棧是爲了執行本地Native方法所服務的
2>本地方法棧的概念和特徵
(與java虛擬機棧非常相似)
.線程私有
.後進先出(LIFO)棧
.存儲棧幀,支撐java方法的調用執行和退出
.可能出現OutOfMemoryError異常和StackOverflowError異常
.有一些虛擬機(如HotSpot)將java虛擬機棧和本地方法棧合併實現
3>java虛擬機中存放的棧元素(棧幀)的概念和特徵
. 棧幀的概念和特徵
java虛擬機棧中存儲的內容,他被用於存儲數據和部分過程結果的數據結構,同時也 被用來處理動態鏈接、方法返回值和異常分派。
一個完整的棧幀包括局部變量表、操作數棧、動態連接信息、方法正常完成和異常完 成信息。
. 局部變量表概念和特徵
由若干個Slot組成,長度由編譯期決定
Slot存儲的8種數據類型:boolean, byte, char, short, int, float, reference, returnAddress
reference類型:reference表示對一個對象實例的引用.
虛擬機可以通過reference類型做到兩點:
. 從引用中直接或間接的查找到對象在java堆中的數據存放的起始地址索引
. 從引用中直接或間接的查找到對象在方法區中存儲的類型信息
一個Slot可以存放一個32位以內的數據類型,那對於64位的數據類型虛擬機會以高位 對齊的方式爲其分配兩個連續的Slot空間
局部變量表用於方法間參數的傳遞,以及方法執行過程中儲存基礎數據類型的值和對 象的引用
Slot是可以被重用的。
4>本地變量表和操作數棧
. 操作數棧的概念和特徵
.是一個後進先出棧,由若干個Enty組成,長度由編譯期決定
.單個Enty可以存儲一個java虛擬機中定義的任意數據類型的值,包括Long和Double,但儲存Long和Double類型的Enty深度爲2,其他類型的深度爲1。
(Enty 棧深度)
在方法執行的過程中,棧幀用於儲存計算參數和計算結果;
在方法調用過程中,操作數棧也用來準備調用方法的參數以及接收方法返回結果
5> 內存異常
OutOfMemoryError異常
原因:
常見的有以下幾種:
1.內存中加載的數據量過於龐大,如一次從數據庫取出過多數據;
2.集合類中有對對象的引用,使用完後未清空,使得JVM不能回收;
3.代碼中存在死循環或循環產生過多重複的對象實體;
4.使用的第三方軟件中的BUG;
5.啓動參數內存值設定的過小;
StackOverflowError異常
StackOverflowError是由於當前線程的棧滿了,也就是函數調用層級過多導致。
比如死遞歸。