Java虛擬機器執行時資料區域劃分

ii_chengzi發表於2018-08-20

Java虛擬機器資料執行時區域

方法區(Method Area)

儲存載入的類資訊,常量,靜態變數,編譯器編譯後的程式碼等資料。雖然JVM規範把方法區描述為堆的一個邏輯部分,但它卻有一個別名叫做Non-Heap。Class檔案中除了有類的版本,欄位,方法,介面等描述資訊外,還有一項是常量池,用於存放編譯器生成的各種字面量和符號引用,包括字串常量。JVM載入Class後把常量池中的資料放入到執行時常量池。方法區的執行時資料(包括執行時常量池)是執行緒共享的。

堆(Java Heap)

堆是被執行緒共享的一塊記憶體區域,在JVM啟動時建立。所有的物件例項以及陣列都要在這裡分配記憶體,但是隨著JIT編譯器的發展,漸漸變得不是那麼絕對了。

虛擬機器棧(Java Virtual Machine Stack)

描述Java方法執行的記憶體模型,每個方法在執行的同時都會建立一個棧幀(Stacks Frame)用於儲存區域性變數表,運算元棧,動態連結,方法出口等資訊。每一個方法從呼叫直至執行完成的過程,就對應一個棧幀在JVM棧中入棧到出棧的過程。 區域性變數表是一組變數值儲存空間,用於存放方法引數和方法內部定義的區域性變數。 所需的記憶體空間在編譯期間完成分配,當進入一個方法時,這個方法需要在棧幀中分配多大的區域性變數空間是完全確定的,在方法執行期間不會改變區域性變數表的大小。為最區域性變數表的容量以變數槽(Slot)小單位,32位虛擬機器中一個Slot可以存放一個32位以內的資料型別(boolean、byte、char、short、int、float、reference和returnAddress八種)。虛擬機器是使用區域性變數表完成引數值到引數變數列表的傳遞過程的,如果是例項方法(非static),那麼區域性變數表的第0位索引的Slot預設是用於傳遞方法所屬物件例項的引用,在方法中透過this訪問。虛擬機器棧是執行緒獨享的。

本地方法棧(Native Method Stack)

與JVM棧發揮的作用非常相似,區別不過是JVM棧為JVM執行Java方法服務,而本地方法棧為JVM使用到的Native方法服務。也是執行緒獨享的。

程式計數器(Program Counter Register)

一塊較小的記憶體空間,可以看作是當前執行緒所執行的位元組碼的行號指示器,位元組碼直譯器就是透過改變計數器的值來選取下一條執行的位元組碼指令。每個執行緒擁有獨立的一個計數器。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31543790/viewspace-2212356/,如需轉載,請註明出處,否則將追究法律責任。

相關文章