1. 程式人生 > >JVM執行時區域由哪幾部分組成?分別介紹一下

JVM執行時區域由哪幾部分組成?分別介紹一下

Java虛擬機器的執行時區域構成圖如下所示:

執行緒共享區域:Java堆:(1)Java堆是java虛擬機器所管理的記憶體中最大的一塊;(2)被所有執行緒共享區域,在虛擬機器啟動時建立,唯一目的存放物件例項;(3)堆區是gc的主要區域,通常情況下分為兩個區塊年輕代和年老代。更細一點年輕代又分為Eden區最要放新建立物件,From survivor 和 To survivor 儲存gc後倖存下的物件,預設情況下各自佔比 8:1:1。 進一步劃分的目的是為了更還的記憶體回收或者更快的記憶體分配;(4)會有異常OutOfMemoneyError;方法區:(1)被所有執行緒共享區域,用於存放已被虛擬機器載入的類資訊,常量,靜態變數等資料。被Java虛擬機器描述為堆的一個邏輯部分。習慣是也叫它永久代(僅僅是因為HotSpot虛擬機器選擇把GC分代收集擴充套件至方法區);
(2)垃圾回收很少光顧這個區域,不過也是需要回收的,主要針對常量池回收,型別解除安裝。(3)會有異常OutOfMemoneyError;執行緒私有區域:程式計數器:(1)當前執行緒所執行的位元組碼指令的行號指示器,如分支、跳轉、迴圈、異常處理、執行緒恢復都依賴程式計數器實現;(2)Java多執行緒是通過執行緒輪流切換並分配CPU時間片來執行的,為了執行緒切換後能恢復到正確的位置,所以每個執行緒都有一個單獨的程式計數器,所以程式計數器是私有的;(3)Jvm沒有規定OutOfMemory的區塊;Java虛擬機器棧:(1)為執行Java方法服務‘(2)當執行緒建立的時候,為執行緒分配一塊記憶體區域,線上程執行的過程中,每個方法的執行都會建立一個棧幀,用於存放區域性變量表、操作棧、動態連結,方法出口等。每個方法從被呼叫,直到被執行完。對應著一個棧幀在虛擬機器中從入棧到出棧的過程;
(3)會有兩種異常StackOverFlowError和 OutOfMemoneyError。當執行緒請求棧深度大於虛擬機器所允許的深度就會丟擲StackOverFlowError錯誤;虛擬機器棧動態擴充套件,當擴充套件無法申請到足夠的記憶體空間時候,丟擲OutOfMemoneyError;(4)它是執行緒私有的,生命週期與執行緒相同;本地方法棧:(1)與java虛擬機器棧所發揮的作用非常相似,它們之間的區別在於java虛擬機器棧執行java方法服務的,本地方法棧是執行本地方法服務的