1. 程式人生 > >深入瞭解Java虛擬機器之Java虛擬機器棧

深入瞭解Java虛擬機器之Java虛擬機器棧

        與程式計數器(想了解計數器看我上一篇部落格)一樣,Java虛擬機器棧也是執行緒私有的,他的生命週期與執行緒相同,虛擬機器棧描述的是Java方法執行的記憶體模式:每個方法在執行的同時都會建立一個棧幀用於儲存區域性變量表,運算元棧,動態連結,方法出口等資訊,每一個方法從呼叫直至執行完成的過程,就是對應著一個棧幀在虛擬機器中入棧到出棧的過程。

        經常有人把java記憶體區域分為堆記憶體和棧記憶體,這種分配比較粗糙,java記憶體區域的劃分實際上比這個複雜得多,這種方式的劃分只能說明大多數程式設計師最關注的、與物件記憶體

分配關係最密切的記憶體區域是這兩塊,其中所指的堆,我會在後面詳細的講解,而所說的  棧  就是現在講的虛擬機器棧,或者說虛擬機器棧中區域性變量表部分。

       區域性變量表存放了編譯期剋制的各種資料型別(boolean,int,short,long,byte,double,float,char)物件引用(reference型別,它不等同於物件本身,可能是指向物件起始地址的引用指標,也可能是隻想一個代表物件的控制代碼或其他於此物件相關的位置)和returnAddresss型別(只想一條位元組碼指令的地址)

     其中64位長度的long和double型別的資料會佔用兩個區域性變數空間,其餘的資料型別只佔用一個。區域性變量表所需的記憶體空間在編譯期間完成分配,當進入一個方法時,這個方法需要在幀中分配大多數的區域性變數空間是完全確定的,在方法執行期間不會改變區域性變量表的大小。

     在java虛擬機器規範中,對這個區域規定了兩個異常狀況,如果執行緒請求的棧深度大於虛擬機器所允許的深度,將丟擲StackOverflowError異常;如果虛擬機器棧可以動態擴充套件(當前大部分java虛擬機器棧都可以動態擴充套件,只不過java虛擬機器規範中也允許固定長度的虛擬機器棧),如果擴充套件時無法申請足夠的空間記憶體,就會跑出OutOfMemoryError異常。