虛擬機類加載機制

一、類加載的時機

  1. 類從被加載到虛擬機內存中開始,到 卸載出內存爲止,它的整個生命週期包括了:加載、驗證、準備、解析、初始化、使用和卸載七個階段。其中驗證、準備和解析三個部分統稱爲連接。

二、類加載器

  1. 定義:虛擬機設計團隊把類加載階段中的”通過一個類的全限定名來獲取描述此類的二進制字節流“這個動作放到Java虛擬機外部去實現,以便讓應用程序自己決定如何去獲取所需要的類。實現這個動作的代碼模塊被稱爲”類加載器“。
  2. 比較兩個類是否“相等”,只有在這兩個類是否是由同一個類加載器加載的前提之下才有意義,否則,即使這兩個類是來源於同一個Class文件,只要加載它們的類加載器不同,那這兩個類就必定不相等。

三、雙親委派模型

  1. 站在Java虛擬機的角度來講,只存在兩種不同的類加載器:一種是啓動類加載器(Bootstrap ClassLoader),這個類加載器使用C++語言實現,是虛擬機自身的一部分;另外一種就是所有其他的類加載器,這些類加載器都有java語言實現,獨立於虛擬機外部,並且全都集成自抽象類java.lang.ClassLoader。
  2. 啓動類加載器(Bootstrap ClassLoader):負責將存放在<JAVA_HOME>\lib目錄中的,或者被-Xbootclasspath參數所指定的路徑中的,並且是虛擬機識別的(僅按照文件名識別,名字不符合的類庫即使放在lib目錄中也不會被加載)類庫加載到虛擬機內存中。該加載器無法被Java程序直接引用。
  3. 擴展類加載器(Extension ClassLoader):由sun.misc.Launcher$ExtClassLoader實現,它負責加載<JAVA_HOME>\lib\ext目錄中的,或者被java.ext.dirs系統變量所自定的路徑中的所有類庫,開發者可以直接使用擴展類加載器。
  4. 應用程序類加載器(Application ClassLoader):由sun.misc.Launcher$AppClassLoader來實現。由於這個類加載器是ClassLoader中的getSystemClassLoader()方法的返回值,所以一般也稱它爲系統類加載器。它負責加載用戶類路徑上(ClassPath)所指定的類庫。如果應用程序中沒有自定義的類加載器,則應用程序類加載器就是程序默認的類加載器。
  5. 類加載器之間的父子關係是通過組合關係來實現的,即子類使用組合關係來複用父類加載器的代碼。
  6. 工作過程:如果一個類加載器收到了類加載請求,它首先不會自己去嘗試加載這個類,而是把這個請求委派給父類加載器去完成,每一層都這樣。只有當父類加載器無法完成時,子類加載器纔會嘗試自己去加載。

四、破壞雙親委派模型

  1. JDK1.2時爲了要兼容之前的版本,是通過重載loadClass()方法來實現類加載器的,但是現在只需要重寫findClass()方法即可。
  2. 當基礎類要調用回用戶的代碼,例如JNDI,Java設計團隊設計了線程上下文加載器。
  3. 由於用戶對程序動態性的追求而導致的,例如代碼熱替換,模塊熱部署,此時的類加載器是網狀結構的,出現了同級查找的現象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章