jvm模型介紹
下圖是jvm記憶體模型圖。
當java程式經過編譯後程式設計位元組碼(.class檔案)後進入不同平臺上的java虛擬機器進行解釋,最後在轉換成不同平臺上的機器碼最終得到執行。
我們來一一介紹。
1.程式計數器(Program Counter Register)(執行緒私有)
程式計數器是用於儲存每個執行緒下一步將執行的jvm指令。
由於java虛擬機器是通過執行緒輪流切換並分配處理器的執行時間來實現多執行緒的。
在任何一個時間段,一個處理器(如果是多核心的就是一個核心)只會處理一個執行緒的指令。
因此為了執行緒切換後可以跳到上一個執行緒的正確位置執行。每一個執行緒都需要一個獨立的程式
計數器。
2.jvm棧(JVM Stack)(執行緒私有)
jvm棧是執行緒私有的,建立每一個執行緒的同時都會建立一個jvm棧。在該棧中,每執行一個
方法就會一個棧幀(Stack Frame),裡面存放的是函式呼叫所需要的維護資訊(區域性
基本變數:【byte,short,int,long,char,boolean,float,double,物件引用,returnAddress(執行一個位元組碼指令的地址)】
,操作棧,動態連結,方法出口等)。
3.堆(heap)(執行緒共享)
它是JVM用來儲存物件例項以及陣列值的區域,每個物件例項包含與之對應的類資訊。堆在java虛擬就啟動時就建立了。
堆是垃圾收集管理(gc)的主要區域。
從記憶體回收角度看:堆可被分為新生代和老年代,細緻點有Eden空間,From Survivor空間,To Survivor空間
堆可以處於物理不連續記憶體空間中。
在實現時,既可以實現成固定大小的,也可以是可擴充套件的,不過當前主流的虛擬機器都是按照可擴充套件來實現的(通過-Xmx
和-Xms 控制)。
4.方法區(Method Area)(執行緒共享)
方法區域儲存了所載入的類的資訊(名稱,修飾符,包等),類中的靜態變數,類中定義的final常量。java虛擬機器規範把方法區
描述為堆的邏輯部分
5.執行時常量池(Runtime Constant Pool)
方法區的一部分,.class檔案中除了有類的版本,欄位,方法,介面等描述資訊外,還有一項資訊是常量池(Constant Pool Table),
用於儲存編譯時產生的各種字面量(由數字或字母構成的數值或字串,出現在等式右邊)和引用,這部分內容將在類載入後存放
到方法區的執行時常量池中。
6.本地方法棧(Native Method Stacks)
本地方法棧支援native方法的執行。