類載入機制

1、JVM 和 類

(1)運行java命令: java 帶有main方法的類名

■ 命令的作用:啟動jvm,並載入位元組碼,執行程式

  • 當調用java命令來運行某個java程式時,該命令將會啟動一個jvm進程(同一個jvm中的所有執行緒變數都處於處於同一個進程中,共享給jvm的記憶體區間。)
  • 每次啟動一個程式,在任務管理器,就會出現一個進程

(2)jvm退出的情況(jvm進程一旦結束,該進程中記憶體中的數據會丟失):

  • 程式正常執行結束
  • 使用System.exit(0) 方法
  • 出現異常,沒有捕獲異常
  • 平台強制結束jvm進程(在任務管理器那裡關閉掉java進程)

2、類載入機制:

image

(1) 將類載入進記憶體中(三個步驟:載入、連接、初始化)

■ 當程式主動使用到某個類時,若該類還沒有被載入進記憶體中,則系統會通過載入、連接、初始化三個步驟對該類就那些初始化操作。
  • 在程式中,每次要用到某類,都是需要將該類載入進內容的(將類載入進記憶體包括了三個步驟:載入、連接、初始化
  • 卸載類:當虛擬機停止工作的時候,該類就從虛擬機中卸載了
  • 類載入進虛擬機的特點當類一旦載入進虛擬機,就不卸載,永駐記憶體,直到虛擬機停止工作。

(2) 類載入機制【載入、連接、初始化、使用、卸載】:

1)類的載入:是指將類的class文件(位元組碼文件)載入記憶體之中,並為之創建一個java.lang.Class對象【位元組碼對象

  • 萬物皆對象,描述對象的類也是一種對象,我們使用java.lang.Class對象【位元組碼對象】來描述類這種對象。
□ 類的載入過程是由類載入器(ClassLoader)完成,類載入器通常是由jvm提供的,我們稱之為系統類載入器,我們也可以自定類載入器(需要繼承ClassLoader類)
  • 不同的類載入器可以實現載入本地位元組碼文件,jar包中的位元組碼,通過網路載入位元組碼等等。
□ 為什麼已經有系統自帶的類載入器,還需要自定義的類載入器?(載入方式不符合需求)
  • 當我們使用框架時,需要載入配置文件時,通過系統載入器的載入方式無法載入配置文件,需要自定義類載入器,重新去定義載入方式。

2) 類的連接:當類被載入進記憶體之後,系統為之生產了一個對應的Class對象【位元組碼對象】,接著把類的二進位數據合併到JRE中。

  • 驗證:檢測被載入的類是否有正確的內部結構。
  • 準備:負責為類的static變數分配記憶體,並設置默認值。
  • 解析:把類的二進位數據中的符號引用替換為直接引用。

3)類的初始化:在此階段,jvm負責對類進行初始化,主要就是對static變數進行初始化。

類的初始化包含如下幾個步驟:

  • 當類還沒被載入和連接,則程式先載入並連接該類
  • 當該類的父類還沒有被初始化,則先初始化其父類
  • 當類中有初始化語句(靜態程式碼塊一般用來載入資源),則系統依次執行這些初始化語句

✿ (3) 總結類的載入機制:

■ 程式需要執行某個類,需要將類載入進記憶體,系統為該類創建位元組碼對象,然後進行初始化,再使用,最後卸載。

類載入進虛擬機的特點當類一旦載入進虛擬機,就不卸載,永駐記憶體,直到虛擬機停止工作。