Java classLoader那些事兒

1.java類加載的定義&過程

  • 1.定義
    將類的.class文件中的二進制數據讀入到內存中,將其放在運行時數據區的方法區內,然後在堆區創建一個java.lang.Class對象,用來封裝類在方法區內的數據結構。類的加載的最終產品是位於堆區中的Class對象,Class對象封裝了類在方法區內的數據結構,並且向Java程序員提供了訪問方法區內的數據結構的接口。
  • 2.類加載的過程
    image.png
  • 3.類編譯的過程
    image.png
  • 4.類加載的各個階段
    image.png

Class對象實際上是在堆區
驗證的過程中包括:文件格式驗證,元數據驗證,字節碼驗證,符號引用驗證
解析階段:類或接口、字段、類方法、接口方法、方法類型、方法句柄、點限定符

clinit()方法:類構造器方法,class類構造器對靜態變量,靜態代碼塊進行初始化,https://blog.csdn.net/u013309870/article/details/72975536linit()方法:對象構造器方法

  • 5.類的初始化與銷燬
    image.png

2.雙親委派模型要點講解

  • 1.定義
    子類加載器收到的類加載請求,不會先去處理,而是先把請求委派給父類加載器處理,當父類加載器處理不了時再返回給子類加載器加載。
  • 2.加載流程
    image.png

這裏的雙親嚴格說其實只有父類,沒有母類,只是泛指雙親爲父類,也不是指祖父類,容易混淆

  • 3.雙親委派相關的類
    image.png

說是雙親委派模型,但是在其實現過程中,其實是通過組合模式實現的.

3.違反雙親委派模型的特例

  • 1.類加載器和抽象類java.lang.ClassLoader比雙親委派模型出現的早,爲滿足用戶自定義類加載器的穩定,需要調用子類的loadClass()方法。
  • 2.通過線程上下文類加載器(Thread Context ClassLoader)滿足JNDI、JDBC、JCE、JAXB和JBI相關服務的類加載需求。
  • 3.爲追求程序動態可用而實現代碼熱替換、模塊熱部署。將目標程序模塊和其類加載器等通過自定義的類加載機制全部替換掉而不需要重啓虛擬機,如OSGi的模塊化熱部署技術,Tomcat的JSP熱替換功能。

4.Tomcat的類加載器

  • 1.類加載器的定義
    類加載器定義:虛擬機設計團隊把類加載階段中的“通過一個類的全限定名來獲取描述此類的二進制字節流”這個動作放到Java虛擬機外部去實現,以便讓應用程序自己決定如何去獲取所需要的類。實現這個動作的代碼模塊稱爲“類加載器”。
  • 2.tomcat的類加載模型
    image.png

上面畫的是tomcat 5,6版本的類加載模型,其中C,D可以有多個。

  • 3.tomcat的類加載結構
    image.png

5.自定義類加載

  • 1.類加載過程使用的核心方法和自定義的過程
    image.png

6.總結

1.JVM類加載的優點或者作用

  • 大多數網絡應用框架底層都會用到
  • 幫助解決類加載相關的問題
  • 是編寫架構底層服務的基礎
  • 幫助編寫更好的應用程序
  • 代碼加密,服務隔離,熱加載
  • 從指定的地方加載類,如磁盤或者網絡

JVM類加載機制

  • 全盤負責,當一個類加載器負責加載某個Class時,該Class所依賴的和引用的其他Class也將由該類加載器負責載入,除非顯示使用另外一個類加載器來載入。
  • 父類委託,先讓父類加載器試圖加載該類,只有在父類加載器無法加載該類時才嘗試從自己的類路徑中加載該類。
  • 緩存機制,緩存機制將會保證所有加載過的Class都會被緩存,當程序中需要使用某個Class時,類加載器先從緩存區尋找該Class,只有緩存區不存在,系統纔會讀取該類對應的二進制數據,並將其轉換成Class對象,存入緩存區。這就是爲什麼修改了Class後,必須重啓JVM,程序的修改纔會生效。
  • 每個類加載器都有自己的命名空間,命名空間由該加載器及所有父加載器所加載的類組成。
  • 在JVM中一個類用其全名和一個加載類ClassLoader的實例作爲唯一標識,不同類加載器加載的類將被置於不同的命名空間。
  • 相關鏈接
    https://www.cnblogs.com/ityouknow/p/5603287.html
    參考深《深入理解Java虛擬機》
    https://blog.csdn.net/sunxianghuang/article/details/52067892
    http://www.imooc.com/article/257848?blockid=tuijianwz
    JIT代碼生成器:https://baike.baidu.com/item/JIT編譯器/3793585?fr=aladdin
    即時編譯(JIT)即時編譯器(JIT compiler,just-in-time compiler)
    https://juejin.im/post/5c890f21f265da2d993dc692
    https://juejin.im/post/5c890f996fb9a049a712ad20
    https://www.cnblogs.com/linghu-java/p/8589843.html
    https://www.cnblogs.com/wxd0108/p/6681618.html
    https://www.cnblogs.com/aspirant/p/8991830.html
    https://www.cnblogs.com/zyzdisciple/p/10100018.html
    https://blog.csdn.net/u013412772/article/details/80837735
    https://blog.csdn.net/dreamcatcher1314/article/details/78271251
    https://blog.csdn.net/uniquewonderq/article/details/79997878
    https://www.cnblogs.com/KingIceMou/p/7208336.html

架構設計@工程設計@服務穩定性之路

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