目錄
- 類的加載程序
- 加載
- 驗證
- 準備
- 決議
- 初始化
- 類加載器的分類
- 雙親委派模型
類的加載程序
類的加載程序分為加載,驗證,準備,決議,初始化共5個階段
類的生命周期加上使用,卸載共7個階段
加載
將位元組碼轉換為二進制位元組流加載到記憶體中,然后生成一個Class物件,用于類資料的訪問
驗證
保證位元組流通過JVM規范校驗和代碼邏輯校驗,
準備
為靜態變數分配記憶體并設定初始值
設定初始值:
- 若使用static修飾的靜態變數,初始化皆為零值
- 若使用static final 修飾的靜態變數,初始化即為代碼設定的值
決議
將常量池中的符號參考替換成直接參考,
初始化
初始化的條件
- 虛擬機啟動時,用戶需要指定一個要執行的主類,虛擬機會先執行該主類
- 通過new,反射創建一個物件時,會觸發類的初始化
- 呼叫一個類的靜態方法時會觸發類的初始化(invokestatic)
- 呼叫靜態變數或者給靜態變數賦值時會觸發類的初始化(getstatic,putstatic)
- 初始化一個類的時候,如果發現其父類還沒有進行初始化,則需要先觸發其父類的初始化
初始化代碼的規律:
父類靜態>子類靜態>父類非靜態,構造器>子類非靜態,構造器
參考這篇文章:兩道面試題,帶你決議Java類加載機制
類加載器的分類
- 啟動類加載器:加載JDK核心類別庫,位于JAVA_HOME\lib
- 擴展類加載器:加載Java的擴展類別庫,位于JAVA_HOME\lib\ext
- 應用程式類加載器:加載程式員寫的Java類
雙親委派模型
雙親委派模型機制:收到類的加載請求時,優先委派給父類加載器加載,如果父類無法加載,再由子類加載,故最終的加載順序都是優先給啟動類加載器加載,再由擴展類加載器加載,依次類推,
目的:避免類的重復加載
【舉個例子】每個類都有一個共同的父類Object,每個類在被加載時都會先去加載Object類,按照雙親委派模型的思路,所有的類都會優先被啟動類加載器加載,那么也就是說只需要加載一次Object,當其他類需要Object時,直接回傳已經加載過的Object.class,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/103723.html
標籤:Java
上一篇:GC回收演算法&GC回收器
下一篇:阿里云ECS服務器購買流程
