Java虛擬機數據運行時區域 方法區(Method Area) 存儲載入的類信息,常量,靜態變數,編譯器編譯後的代碼等數據。雖然JVM規範把方法區描述為堆的一個邏輯部分,但它卻有一個別名叫做Non-Heap。Class文件中除了有類的版本,欄位,方法,介面等描述信息外,還有一項是常量池,用於存放編譯 ...
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)
一塊較小的記憶體空間,可以看作是當前線程所執行的位元組碼的行號指示器,位元組碼解釋器就是通過改變計數器的值來選取下一條執行的位元組碼指令。每個線程擁有獨立的一個計數器。
java學習群669823128