類載入機制
1、JVM 和 類
(1)運行java命令: java 帶有main方法的類名
■ 命令的作用:啟動jvm,並載入位元組碼
,執行程式
- 當調用java命令來運行某個java程式時,該命令將會啟動一個jvm進程(同一個jvm中的所有執行緒變數都處於處於同一個進程中,共享給jvm的記憶體區間。)
- 每次啟動一個程式,在任務管理器,就會出現一個進程
(2)jvm退出的情況(jvm進程一旦結束,該進程中記憶體中的數據會丟失
):
- 程式正常執行結束
- 使用System.exit(0) 方法
- 出現異常,沒有捕獲異常
- 平台強制結束jvm進程(在任務管理器那裡關閉掉java進程)
2、類載入機制:
(1) 將類載入進記憶體中(三個步驟:載入、連接、初始化)
■ 當程式主動使用
到某個類時,若該類還沒有被載入進記憶體中
,則系統會通過載入、連接、初始化
三個步驟對該類就那些初始化操作。
- 在程式中,每次要用到某類,都是需要將該類載入進內容的(將類載入進記憶體包括了三個步驟:載入、連接、初始化)
- 卸載類:當虛擬機停止工作的時候,該類就從虛擬機中卸載了
類載入進虛擬機的特點
:當類一旦載入進虛擬機,就不卸載,永駐記憶體,直到虛擬機停止工作。
(2) 類載入機制【載入、連接、初始化、使用、卸載】:
1)類的載入:是指將類的class文件(位元組碼文件)載入記憶體之中,並為之創建一個java.lang.Class對象【位元組碼對象
】
- 萬物皆對象,描述對象的類也是一種對象,我們使用java.lang.Class對象【位元組碼對象】來描述類這種對象。
□ 類的載入過程是由類載入器
(ClassLoader)完成,類載入器通常是由jvm提供的,我們稱之為系統類載入器,我們也可以自定類載入器(需要繼承ClassLoader類)
- 不同的類載入器可以實現載入本地位元組碼文件,jar包中的位元組碼,通過網路載入位元組碼等等。
□ 為什麼已經有系統自帶的類載入器,還需要自定義的類載入器?(載入方式
不符合需求)
- 當我們使用框架時,需要載入配置文件時,通過系統載入器的載入方式無法載入配置文件,需要自定義類載入器,重新去定義載入方式。
2) 類的連接:當類被載入進記憶體之後,系統為之生產了一個對應的Class對象【位元組碼對象】,接著把類的二進位數據合併到JRE中。
- 驗證:檢測被載入的類是否有正確的內部結構。
- 準備:負責為類的static變數分配記憶體,並設置默認值。
- 解析:把類的二進位數據中的符號引用替換為直接引用。
3)類的初始化:在此階段,jvm負責對類進行初始化,主要就是對static變數進行初始化。
類的初始化包含如下幾個步驟:
- 當類還沒被載入和連接,則程式先載入並連接該類
- 當該類的父類還沒有被初始化,則先初始化其父類
- 當類中有初始化語句(靜態程式碼塊—
一般用來載入資源
),則系統依次執行這些初始化語句
✿ (3) 總結類的載入機制:
■ 程式需要執行某個類,需要將類載入進記憶體,系統為該類創建位元組碼對象,然後進行初始化,再使用,最後卸載。
■ 類載入進虛擬機的特點
:當類一旦載入進虛擬機,就不卸載,永駐記憶體,直到虛擬機停止工作。