[總結]-第七章 虛擬機類加載機制

[總結]-第七章 虛擬機類加載機制

常見操做

一、查看class二進制內容
hexdump -C demo.class
二、打印類加載信息
-XX:+TraceClassLoading
三、關閉類加載過程當中的大部分類驗證措施
-Xverify:none

定義

一、類加載器:

將「經過一個類的全限定名來獲取描述此類的二進制字節流」這個動做放到Java虛擬機外部去實現,以便讓應用程序本身決定如何去獲取所須要的類。java

  • 啓動類加載器:沒法被java程序直接引用;
  • 擴展類加載器
  • 應用程序類加載器:系統類加載器 - 默認的類加載器。
二、類生命週期
一、加載
二、鏈接
    |- 驗證
    |- 準備
    |- 解析
三、初始化
四、使用
五、卸載
三、類加載過程
  • 加載:獲取二進制字節流,並存儲至方法區(文件格式驗證經過後才存儲)。數組

    • 自定義類加載器:重寫類加載器的loadClass()方法。
    • 數組類自己不經過類加載器建立,而是由Java虛擬機直接建立。
    • 一個類必須與類加載器一塊兒肯定惟一性。
    • Class對象比較特殊,雖然是對象,可是存放在方法區中。
  • 驗證:確保Class文件的字節流中包含的信息符合當前虛擬機的要求。微信

    • 文件格式驗證:基於二進制字節流;
    • 元數據驗證:對類的元數據信息進行語義校驗;
    • 字節碼驗證:使用類型檢驗對類的方法體進行校驗分析;
    • 符號引用驗證:對類自身之外的信息進行匹配性校驗。
  • 準備:在方法區中分配類變量的內存並設置類變量初始值(一般狀況下是零值)。模塊化

  • 解析:虛擬機將常量池內的符號引用替換爲直接引用的過程。.net

  • 初始化:執行類構造器<clinit>()方法的過程,前面都是由虛擬機主導和控制(自定義類加載除外),初始化纔是執行類中定義的字節碼。線程

補充:鏈接與加載是交叉的code

四、雙親委派模型

雙親委派 -> 委派雙親對象

工做過程: 若是一個類加載器收到了類加載的請求,將會把這個請求委派給父類加載器去完成(直到最頂級),當父加載器反饋本身沒法完成這個加載請求時,子加載器纔會嘗試本身去加載。接口

好處: Java類隨着它的類加載器一塊兒具有了一種帶有優先級的層次關係。生命週期

五、破壞雙親委派
  • JDK1.0(類加載器使用) 至 JDK1.2之間(雙親委派使用)的兼容;
  • JNDI - 線程上下文類加載器(逆向使用);
  • 動態(OSGI模塊化熱部署)

常識

  • 同一個類加載器下,一個類型只會初始化一次【有鎖機制】。

  • 經過子類引用父類的靜態字段,不會致使子類的初始化。

  • 經過數組定義來引用類,不會觸發此類的初始化。

  • static final修飾的,在編譯階段會存入調用類的常量池中,不須要類的初始化。

  • static 非final的,set與get時,須要觸發類的初始化。

  • 接口與類的區別

    • 類初始化 - 要求父類先初始化
    • 接口初始化 - 只有在使用父接口時才初始化父接口。

博客

https://my.oschina.net/gmarshal

歡迎關注個人我的微信訂閱號:(聽說這個頭像程序猿專用)

輸入圖片說明

相關文章
相關標籤/搜索