初識JVM記憶體區域的劃分
- 初識JVM記憶體區域的劃分
- 總結:
初識JVM記憶體區域的劃分
我們只帶,當Java源代碼(.java)檔案被編譯后,會變成位元組碼(.class)檔案,它是一個二進制檔案,然后位元組碼檔案就會被加載進Java虛擬機中(即:JVM中),而JVM中又是怎樣的呢?
初識JVM記憶體區域的劃分被分為了如下的幾個區域:
如下圖:

- 程式計數器 (PC Register): 只是一個很小的空間, 保存下一條執行的指令的地址.
- 虛擬機堆疊(JVM Stack): 重點是存盤區域變數表(當然也有其他資訊). 我們剛才創建的 int[] arr 這樣的存盤地址的參考就是在這里保存.
- 本地方法堆疊(Native Method Stack): 本地方法堆疊與虛擬機堆疊的作用類似. 只不過保存的內容是Native方法的區域變數. 在有些版本的 JVM 實作中(例如HotSpot), 本地方法堆疊和虛擬機堆疊是一起的.
- 堆(Heap): JVM所管理的最大記憶體區域. 使用 new 創建的物件都是在堆上保存 (例如前面的 new int[]{1, 2, 3} )
- 方法區(Method Area): 用于存盤已被虛擬機加載的類資訊、常量、靜態變數、即時編譯器編譯后的代碼等資料. 方法編譯出的的位元組碼就是保存在這個區域.
- 運行時常量池(Runtime Constant Pool): 是方法區的一部分, 存放字面量(字串常量)與符號參考. (注意 從 JDK 1.7 開始, 運行時常量池在堆上).
Native 方法:
JVM 是一個基于 C++ 實作的程式. 在 Java 程式執行程序中, 本質上也需要呼叫 C++ 提供的一些函式進行和作業系統底層進行一些互動. 因此在 Java 開發中也會呼叫到一些 C++ 實作的函式.
這里的 Native 方法就是指這些 C++ 實作的, 再由 Java 來呼叫的函式.
每一個執行緒都有自己的程式計數器和JVM Stack以及本地方法堆疊,而堆和方法區是所有執行緒共享的,
- 區域變數和參考保存在堆疊上, new 出的物件保存在堆上.
- 堆的空間非常大, 堆疊的空間比較小.
- 堆是整個 JVM 共享一個, 而堆疊每個執行緒具有一份(一個 Java 程式中可能存在多個堆疊).
總結:
- 參考和物件都是一種資料組織形式,所以都是存放在記憶體中的,
- 物件一定保存在堆上,但參考則不一定,
- 參考是一類只能用來指向物件的資料型別,
- 參考可以指向物件,也可以不指向物件,
- 解參考操作就是通過參考找到物件,
- java 中我們無法直接接觸到物件,都是通過參考接觸到物件,
- 對一個空的參考做解參考操作,會出現 NullPointerException
- JVM 為了便于管理,講它管理的記憶體人為的劃分成 6 個區域:
- PC 區
- 虛擬機堆疊
- 本地方法堆疊
- 堆
- 方法區
- 運行時常量池
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/243572.html
標籤:java
上一篇:陣列
