類加載全過程

類加載全過程:
類加載:(被加載到內存中開始-到卸載出內存爲止)
生命週期:

加載-》驗證-》準備-》解析-》初始化-》使用-》卸載
特點:
按照順序開始,而不是按順序進行或完成
靜態綁定:即前期綁定。在程序執行前方法已經被綁定,此時由編譯器或其他鏈接程序實現。
針對java,可以理解爲程序編譯器的綁定。java當中只有final、static、private和構造方法是前期綁定的
動態綁定:即晚期綁定,也叫運行時綁定。在運行時根據具體對象的類型進行綁定。在java中幾乎所有的方法都是後期綁定的

加載:

需要完成:
1. 通過一個類的權限定名來獲取定義此類的二進制字節流
2. 將這個字節所代表的靜態存儲結構轉化爲方法區的運行時數據結構。
3. 在內存中生成一個代表這個類的java.lang.Class對象,作爲方法區這個類的各種數據的訪問入口。

驗證:

是連接階段的第一步:連接階段是:驗證,準備,解析
目的:
爲了確保Class文件的字節流中包含的信息符合當前虛擬機的要求

驗證動作:文件格式驗證(基於二進制字節流,後面三個是基於方法區的存儲結構),元數據驗證,字節碼驗證,符號引用驗證

  • 文件格式驗證目的:保證輸入的字節流能正確的解析並存儲於方法區之內,格式上符合描述一個java類型信息的要求。

  • 元數據驗證目的:對類的元數據信息進行語義校驗,保證不存在不符合java語言規範的元數據信息

  • 字節碼驗證目的:通過數據流和控制流分析,確定程序語義是合法的、符合邏輯的。

  • 符號引用驗證目的:確保解析動作能正常執行。

準備:

正式爲類變量分配內存並設置類變量初始值的階段。
這時候進行內存分配的僅包括類變量(被static修飾的變量),而不包括實例變量,實例變量將會在對象實例化時隨對象一起分配到java堆。
如果字段中存在ConstantValue屬性,在準備階段會被初始化爲ConstantValue屬性(final)所指定的值。

public static final int value = 123;

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

初始化:

初始化階段是執行類構造器(”clinit”())方法的過程。
invokevirtual指令的運行時解析

  1. 找到操作數棧頂的第一個元素所指向的對象的實際類型,記做C
  2. 如果在類型C中找到與常量中的描述符和簡單名稱都相等的方法,則進行訪問權限校驗,如果通過則返回這個方法的直接引用,查找過程結束:如果不通過,則返回java.lang.IllegalAccessError異常。
  3. 否則,按照繼承關係從下往上對C的各個父類進行第2步的搜索和驗證過程
  4. 如果始終沒有找到合適的方法,則拋出java.lang.AbstractMethodError異常
發佈了180 篇原創文章 · 獲贊 335 · 訪問量 64萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章