深入理解JVM虛擬機器6:深入理解JVM類載入機制
本文轉自網際網路,侵刪
本系列文章將整理到我在GitHub上的《Java面試指南》倉庫,更多精彩內容請到我的倉庫裡檢視
喜歡的話麻煩點下Star哈
文章將同步到我的個人部落格:
www.how2playlife.com
本文是微信公眾號【Java技術江湖】的《深入理解JVM虛擬機器》其中一篇,本文部分內容來源於網路,為了把本文主題講得清晰透徹,也整合了很多我認為不錯的技術部落格內容,引用其中了一些比較好的部落格文章,如有侵權,請聯絡作者。
該系列博文會告訴你如何從入門到進階,一步步地學習JVM基礎知識,並上手進行JVM調優實戰,JVM是每一個Java工程師必須要學習和理解的知識點,你必須要掌握其實現原理,才能更完整地瞭解整個Java技術體系,形成自己的知識框架。
為了更好地總結和檢驗你的學習成果,本系列文章也會提供每個知識點對應的面試題以及參考答案。
如果對本系列文章有什麼建議,或者是有什麼疑問的話,也可以關注公眾號【Java技術江湖】聯絡作者,歡迎你參與本系列博文的創作和修訂。
一.目標:
1.什麼是類的載入?
2.類的生命週期?
3.類載入器是什麼?
4.雙親委派機制是什麼?
二.原理 (類的載入過程及其最終產品):
JVM將class檔案位元組碼檔案載入到記憶體中, 並將這些靜態資料轉換成方法區中的執行時資料結構,在堆(並不一定在堆中,HotSpot在方法區中)中生成一個代表這個類的java.lang.Class 物件,作為方法區類資料的訪問入口。
三.過程(類的生命週期):
JVM類載入機制分為五個部分:載入,驗證,準備,解析,初始化,下面我們就分別來看一下這五個過程。其中載入、檢驗、準備、初始化和解除安裝這個五個階段的順序是固定的,而解析則未必。為了支援動態繫結,解析這個過程可以發生在初始化階段之後。
載入:
載入過程主要完成三件事情:
- 通過類的全限定名來獲取定義此類的二進位制位元組流
- 將這個類位元組流代表的靜態儲存結構轉為方法區的執行時資料結構
- 在堆中生成一個代表此類的java.lang.Class物件,作為訪問方法區這些資料結構的入口。
這個過程主要就是類載入器完成。
校驗:
此階段主要確保Class檔案的位元組流中包含的資訊符合當前虛擬機器的要求,並且不會危害虛擬機器的自身安全。
- 檔案格式驗證:基於位元組流驗證。
- 後設資料驗證:基於 方法區的儲存結構驗證。
- 位元組碼驗證:基於方法區的儲存結構驗證。
- 符號引用驗證:基於方法區的儲存結構驗證。
準備:
為類變數分配記憶體,並將其初始化為預設值。(此時為預設值,在初始化的時候才會給變數賦值)即在方法區中分配這些變數所使用的記憶體空間。例如:
public static int value = 123;
此時在準備階段過後的初始值為0而不是123;將value賦值為123的putstatic指令是程式被編譯後,存放於類構造器
public static final int value = 123;
此時value的值在準備階段過後就是123。
解析:
把型別中的符號引用轉換為直接引用。
- 符號引用與虛擬機器實現的佈局無關,引用的目標並不一定要已經載入到記憶體中。各種虛擬機器實現的記憶體佈局可以各不相同,但是它們能接受的符號引用必須是一致的,因為符號引用的字面量形式明確定義在Java虛擬機器規範的Class檔案格式中。
- 直接引用可以是指向目標的指標,相對偏移量或是一個能間接定位到目標的控制程式碼。如果有了直接引用,那引用的目標必定已經在記憶體中存在
主要有以下四種:
- 類或介面的解析
- 欄位解析
- 類方法解析
- 介面方法解析
初始化:
初始化階段是執行類構造器
java中,對於初始化階段,有且只有以下五種情況才會對要求類立刻“初始化”(載入,驗證,準備,自然需要在此之前開始): 把類載入階段的“通過一個類的全限定名來獲取描述此類的二進位制位元組流”這個動作交給虛擬機器之外的類載入器來完成。這樣的好處在於,我們可以自行實現類載入器來載入其他格式的類,只要是二進位制位元組流就行,這就大大增強了載入器靈活性。系統自帶的類載入器分為三種:
雙親委派機制工作過程: 如果一個類載入器收到了類載入器的請求.它首先不會自己去嘗試載入這個類.而是把這個請求委派給父載入器去完成.每個層次的類載入器都是如此.因此所有的載入請求最終都會傳送到Bootstrap類載入器(啟動類載入器)中.只有父類載入反饋自己無法載入這個請求(它的搜尋範圍中沒有找到所需的類)時.子載入器才會嘗試自己去載入。 雙親委派模型的優點:java類隨著它的載入器一起具備了一種帶有優先順序的層次關係. 例如類java.lang.Object,它存放在rt.jart之中.無論哪一個類載入器都要載入這個類.最終都是雙親委派模型最頂端的Bootstrap類載入器去載入.因此Object類在程式的各種類載入器環境中都是同一個類.相反.如果沒有使用雙親委派模型.由各個類載入器自行去載入的話.如果使用者編寫了一個稱為“java.lang.Object”的類.並存放在程式的ClassPath中.那系統中將會出現多個不同的Object類.java型別體系中最基礎的行為也就無法保證.應用程式也將會一片混亂.
https://segmentfault.com/a/1190000009707894
https://www.cnblogs.com/hysum/p/7100874.html
四.類載入器:
五.雙親委派機制:
參考文章
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69951287/viewspace-2664029/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 深入理解JVM,虛擬機器類載入機制JVM虛擬機
- 深入理解jvm-2Edition-虛擬機器類載入機制JVM虛擬機
- 深入理解JVM(③)虛擬機器的類載入時機JVM虛擬機
- 深入理解JVM(③)虛擬機器的類載入過程JVM虛擬機
- 深入理解JVM——(四)類載入機制JVM
- 深入理解Java虛擬機器 - 類載入機制Java虛擬機
- 深入理解Java虛擬機器(類載入機制)Java虛擬機
- 深入理解Java虛擬機器 --- 類載入機制Java虛擬機
- 深入理解虛擬機器之虛擬機器類載入機制虛擬機
- 深入理解JVM(③)虛擬機器的類載入器(雙親委派模型)JVM虛擬機模型
- 深入淺出JVM(三)之HotSpot虛擬機器類載入機制JVMHotSpot虛擬機
- 理解JVM(四):JVM類載入機制JVM
- 深入理解JVM(四)類載入的時機JVM
- JVM(7)-虛擬機器類載入機制JVM虛擬機
- 虛擬機器系列 | JVM類載入機制虛擬機JVM
- JVM(五)----虛擬機器類載入機制JVM虛擬機
- JVM學習-虛擬機器類載入機制JVM虛擬機
- JVM(三)-java虛擬機器類載入機制JVMJava虛擬機
- 深入理解JVM虛擬機器3:垃圾回收器詳解JVM虛擬機
- 【Java虛擬機器規範】JVM類載入機制Java虛擬機JVM
- 【進階之路】深入理解Java虛擬機器的類載入機制(長文)Java虛擬機
- 深入理解 JVM 之 垃圾回收機制JVM
- 《深入理解java虛擬機器》第七章讀書筆記——虛擬機器類載入機制Java虛擬機筆記
- 深入理解OSGi類載入機制
- 深入理解JVM(③)虛擬機器效能監控、故障處理工具JVM虛擬機
- 深入理解JVM(③)——之HotSpot虛擬機器物件探祕JVMHotSpot虛擬機物件
- 深入理解Java虛擬機器之JVM記憶體佈局篇Java虛擬機JVM記憶體
- (深入理解 Java虛擬機器)一篇文章帶你深入瞭解Java 虛擬機器類載入器Java虛擬機
- 深入理解JVM虛擬機器2:JVM垃圾回收基本原理和演算法JVM虛擬機演算法
- 深入理解JVM虛擬機器-JVM記憶體區域與記憶體溢位JVM虛擬機記憶體溢位
- 深入理解java虛擬機器Java虛擬機
- 要點提煉| 理解JVM之類載入機制JVM
- 深入java虛擬機器學習–類的載入機制(四)Java虛擬機機器學習
- 深入理解JVM虛擬機器-物件引用,GC與記憶體分配回收JVM虛擬機物件GC記憶體
- 深入理解JVM虛擬機器1:JVM記憶體的結構與消失的永久代JVM虛擬機記憶體
- 深入探究JVM之類載入與雙親委派機制JVM
- 深入理解Java虛擬機器(一)Java虛擬機
- 深入理解Java虛擬機器(二)Java虛擬機