1. 程式人生 > >JVM篇:淺談java虛擬機器記憶體模型

JVM篇:淺談java虛擬機器記憶體模型

 

博主最近嘗試著瞭解JVM,博主目前的一些理解,總之會隨著博主的深入瞭解慢慢完善吧

圖片來自網路

當JVM執行時,便會建立這五個區域,退出時銷燬。

JVM的五個區域:方法區、堆、棧(也可以稱為虛擬機器棧)、程式計數器、本地方法棧

博主在這裡說明一下:方法區概括了元空間,在HotSpot(一種JVM,目前大多數人使用)中可以理解為方法區是一個標準,元空間則是實現它:jdk8版本以前稱為永久代,jdk8後被徹底刪除由元空間取代

  1. 方法區(主要儲存區): 雖然方法區也是所有執行緒共享的, 但方法區與堆是區分開來的,它還有一個別名(Non-Heap即非堆,大致上就是為了區分開來堆),方法區儲存了類的結構資訊,即元資料

    ,例如:執行時常量池、欄位、方法資料、建構函式、方法程式碼、類載入器引用方法資料:指的是每個方法的修飾符、名字、返回型別、引數型別、屬性,方法程式碼:指的是每個方法的位元組碼、運算元棧大小、區域性變數大小、區域性變量表、異常表和每個異常處理的開始位置、結束位置、程式碼處理在程式計數器中的偏移地址、被捕獲的異常類的常量池索引),方法區可以固定容量大小,也可動態自動判斷程式需求來決定是否擴充套件或縮小容量。

  2. :堆是所有執行緒共享的記憶體區域,是物件例項、陣列儲存的區域,它的容量可以是固定大小的,也可以隨著程式執行的需求動態擴充套件,並在不需要過多空間時自動收縮
  3. :棧從字面上理解可以為:資料暫時儲存的地方,它是一種資料結構

    ,是一種只能在一端進行插入和刪除操作的特殊線性表先入後出原則。當JVM得到一個Java位元組碼應用程式後,便為該程式碼中一個類的每一個方法建立一個棧框架,即棧幀,棧幀會隨著方法呼叫而建立,隨著方法結束而銷燬(無論是正常完成或異常都算方法結束)。

    有下三類資訊:

    區域性變數

    執行環境(即棧幀對執行時常量池的引用、方法出口等)

    運算元棧                                                                                                                                                                          

  4. 程式計數器: 也可以稱為暫存器,在該執行緒啟動時,便會建立專屬於它的暫存器,它的內容是指向下一個要執行的暫存器地址,也就是有著記錄執行緒切換的作用。

  5. 本地方法棧:可以簡單理解為它是java呼叫非java程式碼的介面,這部分過於高階,博主能力有限,大家可以自行去買相關書籍來理解底層程式碼。