JVM知識點——類加載機制相關考點

類加載機制相關考點

1.詳解類加載機制

類的加載指的是將編譯好的class類文件中的字節碼讀入到內存中,將其放在方法區內並建立對應的Class對象。java

類的加載分爲加載、連接、初始化,其中連接又包括驗證、準備、解析三步。咱們逐個分析:bootstrap

  • 加載是文件到內存的過程。經過類的徹底限定名查找此類字節碼文件,並利用字節碼文件建立一個Class對象安全

  • 驗證是對類文件內容驗證。目的在於確保Class文件符合當前虛擬機要求,不會危害虛擬機自身安全。主要包括四種:文件格式驗證,元數據驗證,字節碼驗證,符號引用驗證spa

  • 準備階段是進行內存分配。爲類變量也就是類中由static修飾的變量分配內存,而且設置初始值,這裏要注意,初始值是0或者null,而不是代碼中設置的具體值,代碼中設置的值是在初始化階段完成的。另外這裏也不包含用final修飾的靜態變量,由於final在編譯的時候就會分配了。指針

  • 解析主要是解析字段、接口、方法。主要是將常量池中的符號引用替換爲直接引用的過程。直接引用就是直接指向目標的指針、相對偏移量等。對象

  • 最後是初始化:主要完成靜態塊執行與靜態變量的賦值。這是類加載最後階段,若被加載類的父類沒有初始化,則先對父類進行初始化。接口

只有對類主動使用時,纔會進行初始化,初始化的觸發條件包括建立類的實例的時候、訪問類的靜態方法或者靜態變量的時候、Class.forName()反射類的時候、或者某個子類被初始化的時候。生命週期

類的生命週期,就是從類的加載到類實例的建立與使用,再到類對象再也不被使用時能夠被GC卸載回收。這裏要注意一點,由java虛擬機自帶的三種類加載器加載的類在虛擬機的整個生命週期中是不會被卸載的,只有用戶自定義的類加載器所加載的類才能夠被卸載。內存

2.詳解類加載器

java自帶的三種類加載器分別是:bootstrap啓動類加載器、擴展類加載器和應用加載器也叫系統加載器。圖右邊的桔黃色文字表示各種加載器對應的加載目錄。啓動類加載器加載java home中lib目錄下的類,擴展加載器負責加載ext目錄下的類,應用加載器加載classpath指定目錄下的類。虛擬機

除此以外,能夠自定義類加載器。

Java的類加載使用雙親委派模式,即一個類加載器在加載類時,先把這個請求委託給本身的父類加載器去執行,若是父類加載器還存在父類加載器,就繼續向上委託,直到頂層的啓動類加載器,如圖中藍色向上的箭頭。若是父類加載器可以完成類加載,就成功返回,若是父類加載器沒法完成加載,那麼子加載器纔會嘗試本身去加載。

這種雙親委派模式的好處,一個能夠避免類的重複加載,另外也避免了java的核心API被篡改。

相關文章
相關標籤/搜索