jvm筆記二(java虛擬機棧和本地方法棧)

(來源:極客學院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是由於當前線程的棧滿了,也就是函數調用層級過多導致。


比如死遞歸。


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