Java 虛擬機器原理
阿新 • • 發佈:2018-11-10
Java 虛擬機器(JVM)的記憶體空間分為五個部分,分別是:
- 程式計數器
- Java 虛擬機器棧
- 本地方法棧
- 堆
- 方法區。
1.程式計數器
概念:是一塊較小的記憶體空間,程式計數器裡面記錄的是當前執行緒正在執行的那一條位元組碼指令的地址
作用:
- 位元組碼直譯器通過改變程式計數器來依次讀取指令,從而實現程式碼的流程控制,如:順序執行、選擇、迴圈、異常處理。
- 在多執行緒的情況下,程式計數器用於記錄當前執行緒執行的位置,從而當執行緒被切換回來的時候能夠知道該執行緒上次執行到哪兒了。
2.Java虛擬機器棧
概念:主要由區域性變量表構成
特點:區域性變量表的大小在編譯時期就確定下來了
3.本地方法棧
功能和Java虛擬機器棧類似,是本地方法執行的記憶體模型
4.堆
堆是用來存放物件的記憶體空間,整個 Java 虛擬機器只有一個堆,所有的執行緒都訪問同一個堆
5.方法區
是堆的一個邏輯部分。方法區中存放已經被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼等
Java物件建立
- 檢查常量池中是否有即將要建立的這個物件所屬的類的符號引用(若常量池中沒有這個類的符號引用,說明這個類還沒有被定義。丟擲ClassNotFoundException)
- 進而檢查這個符號引用所代表的類是否已經被JVM載入(沒有載入則載入,已載入則分配記憶體)
- 根據方法區中該類的資訊確定該類所需的記憶體大小;
- 從堆中劃分一塊對應大小的記憶體空間給新的物件
- 為物件中的成員變數賦上初始值(預設初始化);
- 設定物件頭中的資訊;
- 呼叫物件的建構函式進行初始化;
此時,整個物件的建立過程就完成了。
垃圾回收
可達性分析法 :所有和GC Roots直接或間接關聯的物件都是有效物件,和GC Roots沒有關聯的物件就是無效物件。
GC Roots是指:
Java虛擬機器棧所引用的物件(棧幀中區域性變量表中引用型別的變數所引用的物件)
方法區中靜態屬性引用的物件
方法區中常量所引用的物件
本地方法棧所引用的物件