1. 類載入過程:載入、驗證、準備、解析、初始化
載入
在載入階段,虛擬機器主要完成三件事:
1.透過一個類的全限定名來獲取定義此類的二進位制位元組流。
2.將這個位元組流所代表的靜態儲存結構轉化為方法區域的執行時資料結構。
3.在Java堆中生成一個代表這個類的java.lang.Class物件,作為方法區域資料的訪問入口
驗證
驗證階段作用是保證Class檔案的位元組流包含的資訊符合JVM規範,不會給JVM造成危害。如果驗證失敗,就會丟擲一個java.lang.VerifyError異常或其子類異常。驗證過程分為四個階段
1.檔案格式驗證:驗證位元組流檔案是否符合Class檔案格式的規範,並且能被當前虛擬機器正確的處理。
2.元資料驗證:是對位元組碼描述的資訊進行語義分析,以保證其描述的資訊符合Java語言的規範。
3.位元組碼驗證:主要是進行資料流和控制流的分析,保證被校驗類的方法在執行時不會危害虛擬機器。
4.符號引用驗證:符號引用驗證發生在虛擬機器將符號引用轉化為直接引用的時候,這個轉化動作將在解析階段中發生。
準備
準備階段為變數分配記憶體並設定類變數的初始化。在這個階段分配的僅為類的變數(static修飾的變數),而不包括類的例項變數。對已非final的變數,JVM會將其設定成“零值”,而不是其賦值語句的值:
pirvate static int size = 12;
那麼在這個階段,size的值為0,而不是12。 final修飾的類變數將會賦值成真實的值。
解析
解析過程是將常量池內的符號引用替換成直接引用。主要包括四種類型引用的解析。類或介面的解析、欄位解析、方法解析、介面方法解析。
初始化
在準備階段,類變數已經經過一次初始化了,在這個階段,則是根據程式設計師透過程式制定的計劃去初始化類的變數和其他資源。這些資源有static{}塊,建構函式,父類的初始化等。
至於使用和解除安裝階段階段,這裡不再過多說明,使用過程就是根據程式定義的行為執行,解除安裝由GC完成。
使用
新執行緒---程式計數器----jvm棧執行(物件引用)-----堆記憶體(直接引用)----方法區
解除安裝
GC垃圾回收
1. 雙親委派機制、意義、方法
機制
啟動(Bootstrap)類載入器----->標準擴充套件(Extension)類載入器--->系統(System)類載入器---->上下文(Custom)類載入器 從左到右載入:首先將載入任務委託給父類載入器,依次遞迴,如果父類載入器可以完成類載入任務,就成功返回;只有父類載入器無法完成此載入任務時,才自己去載入。
意義
防止記憶體中出現多份同樣的位元組碼
使用委託機制,會遞迴的向父類查詢,如果類A中引用了類B,Java虛擬機器將使用載入類A的類載入器去載入類B,如果A載入器已載入類A,那麼B使用A的類載入器進行載入時,就不會在載入類A的位元組碼了
方法
1. 啟動(Bootstrap)類載入器
2. 標準擴充套件(Extension)類載入器
3. 應用程式類載入器(Application)
4. 上下文(Custom)類載入器
1. 類載入過程:載入、驗證、準備、解析、初始化
載入
在載入階段,虛擬機器主要完成三件事:
1.透過一個類的全限定名來獲取定義此類的二進位制位元組流。
2.將這個位元組流所代表的靜態儲存結構轉化為方法區域的執行時資料結構。
3.在Java堆中生成一個代表這個類的java.lang.Class物件,作為方法區域資料的訪問入口
驗證
驗證階段作用是保證Class檔案的位元組流包含的資訊符合JVM規範,不會給JVM造成危害。如果驗證失敗,就會丟擲一個java.lang.VerifyError異常或其子類異常。驗證過程分為四個階段
1.檔案格式驗證:驗證位元組流檔案是否符合Class檔案格式的規範,並且能被當前虛擬機器正確的處理。
2.元資料驗證:是對位元組碼描述的資訊進行語義分析,以保證其描述的資訊符合Java語言的規範。
3.位元組碼驗證:主要是進行資料流和控制流的分析,保證被校驗類的方法在執行時不會危害虛擬機器。
4.符號引用驗證:符號引用驗證發生在虛擬機器將符號引用轉化為直接引用的時候,這個轉化動作將在解析階段中發生。
準備
準備階段為變數分配記憶體並設定類變數的初始化。在這個階段分配的僅為類的變數(static修飾的變數),而不包括類的例項變數。對已非final的變數,JVM會將其設定成“零值”,而不是其賦值語句的值:
pirvate static int size = 12;
那麼在這個階段,size的值為0,而不是12。 final修飾的類變數將會賦值成真實的值。
解析
解析過程是將常量池內的符號引用替換成直接引用。主要包括四種類型引用的解析。類或介面的解析、欄位解析、方法解析、介面方法解析。
初始化
在準備階段,類變數已經經過一次初始化了,在這個階段,則是根據程式設計師透過程式制定的計劃去初始化類的變數和其他資源。這些資源有static{}塊,建構函式,父類的初始化等。
至於使用和解除安裝階段階段,這裡不再過多說明,使用過程就是根據程式定義的行為執行,解除安裝由GC完成。
使用
新執行緒---程式計數器----jvm棧執行(物件引用)-----堆記憶體(直接引用)----方法區
解除安裝
GC垃圾回收
1. 雙親委派機制、意義、方法
機制
啟動(Bootstrap)類載入器----->標準擴充套件(Extension)類載入器--->系統(System)類載入器---->上下文(Custom)類載入器 從左到右載入:首先將載入任務委託給父類載入器,依次遞迴,如果父類載入器可以完成類載入任務,就成功返回;只有父類載入器無法完成此載入任務時,才自己去載入。
意義
防止記憶體中出現多份同樣的位元組碼
使用委託機制,會遞迴的向父類查詢,如果類A中引用了類B,Java虛擬機器將使用載入類A的類載入器去載入類B,如果A載入器已載入類A,那麼B使用A的類載入器進行載入時,就不會在載入類A的位元組碼了
方法
1. 啟動(Bootstrap)類載入器
2. 標準擴充套件(Extension)類載入器
3. 應用程式類載入器(Application)
4. 上下文(Custom)類載入器