Java虛擬機棧---本地方法棧


1.Java虛擬機棧(Java Virtual Machine Stacks)

   線程私有,它的生命周期與線程相同。描述的是Java方法執行的內存模型:每個方法在執行的同時都會創建一個棧幀(Stack Frame)用於存儲局部變量表、

操作數棧、動態鏈接、方法出口等信息。每一個方法從調用直至執行完成的過程,對應着一個棧幀在虛擬機中入棧到出棧的過程。

  有人會把Java內存區分為堆內存(Heap)和棧內存(Stack),這種分發太過粗糙,Java內存區域的划分實際上遠比這個要復雜很多,

這種划分只是說大多數程序員最關注的、與對象內存分配關系最密切的內存區域是這兩塊。“棧內存”就是指虛擬機棧,或者說是虛擬機棧中的局部變量表部分。

  局部變量表存放着編譯期可知的各種基本數據類型(boolean、byte、char、short、int、float、long、double)、對象引用(reference類型,

它不等同於對象本身,可能是一個指向對象起始地址的引用指針,也可能是指向一個代表對象的句柄或其他與此對象相關的位置)和returnAddress類型(指向了一個字節碼指令的地址)。

   其中64位長度的longdouble類型的數據會占用2個局部變量空間(Slot),其余的數據類型只占用1個。局部變量表所需的內存空間在編譯期間完成分配,

當進入一個方法時,這個方法需要在幀中分配多大的局部變量空間是完全確定的,在運行期間不會改變局部變量表的大小。

   在java虛擬機規范中,對這個區域定了兩種異常狀況:如果線程請求的棧深度大於虛擬機所允許的深度,將拋出一個StackOverflowError異常;

如果虛擬機棧可以動態擴展而在擴展時無法申請到足夠的內存,就會拋出一個OutOfMemoryError異常。

StackOverflowError:線程請求的棧深度大於虛擬機所允許的深度。

OutOfMemoryError:如果虛擬機棧可以動態擴展,而擴展時無法申請到足夠的內存。

 

2.本地方法棧(Native Method Stack) 

    在虛擬機規范中對本地方法棧中方法使用的語言、使用方式與數據結構並沒有強制規定,因此具體的虛擬機可以自由實現它。

甚至有的虛擬機(比如:Sun HotSpot虛擬機)直接就把本地方法棧和虛擬機棧合二為一。與虛擬機一樣,

本地方法棧區域也會拋出StackOverflowErrorOutOfMemoryError異常。

 

兩者之間的區別:

    本地方法棧和虛擬機棧所發揮的作用時非常相似的,它們之間的區別只不過是虛擬機棧為虛擬機執行Java方法服務,

  而本地方法棧則為虛擬機使用到Native方法服務。

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM