九、JVM記憶體模型詳解

Hro發表於2018-12-03

一、JAVA執行時,記憶體區域主要劃分為5部分: 方法區、堆、虛擬機器棧、本地方法棧、程式計數器,如圖:

九、JVM記憶體模型詳解
1、方法區: 屬於執行緒共享的記憶體區域,又稱Non-Heap(非堆), 用於儲存已被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼等資料, 執行時常量池(Runtime Constant Pool)存在於方法區中,存放編譯器生成的各種字面量和符號引用。

2、堆: 屬於執行緒共享的記憶體區域,用於存放物件例項。同時Java 堆是垃圾收集器管理的主要區域。 堆可以分為:新生代、老年代,新生代又可以劃分為:1個Eden(伊甸)區和2個Survivor(倖存)區(From Survivor、To Survivor); 新建立的物件在Eden區, 當經過一次Minor GC(年輕代記憶體清理),存活的物件被移動到From Survivor區, 第二次Eden區進行Minor GC時候,From Survivor區的物件和Eden區的物件被移動到To Survivor,如此迴圈往復。 物件的複製次數達到16次,該物件就會被送到老年代中。

   Minor GC:清理新生代
   Major GC:清理老年代
   Full GC:清理整個堆區。
複製程式碼

3、虛擬機器棧: 屬於執行緒私有的資料區域,與執行緒同時建立,總數與執行緒關聯,代表Java方法執行的記憶體模型。 每個方法執行時都會建立一個棧楨來儲存方法的的變數表、運算元棧、動態連結方法、返回值、返回地址等資訊。 每個方法從呼叫直結束就對於一個棧楨在虛擬機器棧中的入棧和出棧過程。

4、本地方法棧: 屬於執行緒私有的資料區域,為虛擬機器使用到的Native方法服務

5、程式計數器: 屬於執行緒私有的資料區域,是一小塊記憶體空間,主要代表當前執行緒所執行的位元組碼行號指示器。位元組碼直譯器工作時, 通過改變這個計數器的值來選取下一條需要執行的位元組碼指令,分支、迴圈、跳轉、異常處理、執行緒恢復等基礎功能都需要依賴這個計數器來完成。

相關文章