JVM虛擬機(一) 內存區域

JVM虛擬機內存組成:
以下圖:
                     
1. 程序計數器:
(1)是一塊較小的內存空間;能夠看作當前程序執行子界面的行號指示器,字節碼解析器執行的時候就是根據這個判斷下一條指令該執行什麼。
(2)由於cpu在執行代碼的時候,會在多個線程之間進行切換執行,因此爲了在cup切換後恢復到正確的執行位置,每條線程都有一個獨立的程序計數器,各線程之間互不影響,獨立存在,咱們稱此類內存爲「線程私有」的內存。
(3) 若是當前cup執行的是java代碼,這個計數器是記錄的是正在執行的虛擬機字節碼的地址;若是執行的native方法,這個計數器則爲空(unfinished),此區域是虛擬機規定的惟一一個在java虛擬機規範中規定沒有任何OutOfMemeryError狀況的區域。
 
2. 虛擬機棧區:
(1)和程序計數器同樣虛擬機棧也是線程私有的,它的生命週期和線程相同。
(2)其描述的java方法執行內存模型,每個方法在執行的時候都會建立一個棧幀;用來存放局部變量,操做數棧,動態連接,方法出口,返回值;當一個方法開始執行到執行結束就是一個棧幀從入棧到出棧的過程。
(3)棧區對應兩中異常: 當線程請求的棧深度大於虛擬機所容許的深度是,會拋出StackOverflowError異常;若是虛擬機的棧是能夠動態擴展的,當擴展時申請不到足夠的空間時,會拋出OutOfmemeryError。
 
3. 本地方法區:
(1)和虛擬機棧區很是類似,只是本地方法區是虛擬機調用native方法服務是的內存。
 
4. 虛擬機堆區:
(1) java程序中建立的實例隊形都放在堆區, 是一個線程共享區。
(2) 堆區是垃圾回收器管理的主要區域,因此很時候也稱爲「GC堆」。
(3) 如今垃圾會收器大多數爲分代回收,因此又分爲「新生代」和「老年代」;「新生代」又能夠分爲eden區和survivor to 和 survivor from 區。
(4) 堆區能夠是物理內存中不連續的空間,邏輯上連續就能夠;能夠是可擴展的也能夠是固定的,若是是可擴展的,當建立對象分配內存的時候,沒法申請到內存的時候就會拋出: OutOfmemeryError
(5) 設置堆內存的大小參數: -Xmx(最大),-Xms(最小)
 
5. 方法區:
(1) 和堆內存同樣,是線程共享區;用於存儲已被虛擬機加載的類信息,常量,靜態變量。
 
參考資料: 深刻理解Java虛擬機:JVM高級特性與最佳實踐
相關文章
相關標籤/搜索