1. 程式人生 > >Java虛擬機運行時數據區域劃分

Java虛擬機運行時數據區域劃分

har 接口 共享 字符串常量 實例方法 package 作用 -s strip

技術分享圖片

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

Java虛擬機運行時數據區域劃分