JAVA-大白話探索JVM-類載入器(一)

Berton Lee發表於2019-01-14

JVM

Java語言的一個非常重要的特點就是與平臺的無關性。而使用Java虛擬機器是實現這一特點的關鍵。JVM是Java Virtual Machine(Java虛擬機器)的縮寫,Java程式編譯後,產生.class檔案,並不是在CPU上執行,而是由JVM執行,JVM遮蔽了與具體平臺相關的資訊,針對平臺開發其對應的直譯器,Java 虛擬機器在執行位元組碼時,把位元組碼解釋成具體平臺上的機器指令執行。因此實現java平臺無關性。從而實現 一次編譯,到處執行

JAVA-大白話探索JVM-類載入器(一)

所以,JVM是啥??

不急不急。 先聽我講個故事,從前有座山,山裡有座廟···,呃...,錯了,再來 從前有名學生,name叫貓貓,手持iphone6,戴著耳機,在課上偷聽歌。~囧架架,囧架架。 之後再因緣巧合之下,貓貓榮獲7p,那麼,問題來了,還能繼續使用該耳機嗎? 當然是無法使用。 當你使用6的耳機時,卻發現怎麼也無法使用在iphone7p上(頭尾不對),那怎麼辦??這時轉介面就派上用場了。

JAVA-大白話探索JVM-類載入器(一)
只需將耳機線完美插入洞裡,然後就可以在課上偷偷聽歌了。。。呃… 同理,JVM 可以理解為“轉介面”,JVM 就是為了方便開發者在編譯完java程式碼後,在不同系統都可執行。做到一次編譯,到處執行。 囧架架~~囧囧架

JVM = 類載入器 classloader + 執行引擎 execution engine + 執行時資料區域 runtime data area 現在我們知道JVM是什麼了,那來說說看是編譯後的.class是怎麼載入到記憶體中的。

JAVA-大白話探索JVM-類載入器(一)

類載入器

話不多說,直接上圖

JAVA-大白話探索JVM-類載入器(一)
我知道看不懂。我也看不懂。哈哈…
JAVA-大白話探索JVM-類載入器(一)

不急,先知道是幹啥用的。

作用:裝載.class檔案 指將類.class檔案中的二進位制資料讀入到記憶體中,將其放在執行時資料區的方法區內,然後堆中建立一個java.lang.Class物件,用來封裝類在方法區的資料結構。 注:類載入器並不需要等到某個類被“首次主動使用”時再載入它,JVM規範允許類載入器在預料某個類將要被使用時就預先載入它

講類載入器,一定要知道的機制

JAVA-大白話探索JVM-類載入器(一)

雙親委派模型(Parent Delegation Model)

雙親委派模型中除了啟動類載入器之外其餘都需要有自己的父類載入器,如圖中Bootstartp ClassLoader。子類載入器和父類載入器不是以繼承的關係來實現,而是通過組合關係來複用父載入器的程式碼。

過程

  1. 當前 ClassLoader 首先從自己已經載入的類中查詢是否此類已經載入,如果已經載入則直接返回原來已經載入的類。沒有的話,就會收到了類載入請求,自己不會首先載入,而是委派給父載入器進行載入,每個層次的載入器都是這樣。直到Bootstartp ClassLoader
每個類載入器都有自己的載入快取,當一個類被載入了以後就會放入快取,
等下次載入的時候就可以直接返回了。
複製程式碼

好處

雙親委派的好處 : 主要是為了安全性,避免使用者自己編寫的類動態替換 Java 的一些核心類,由於每個類載入都會經過最頂層的啟動類載入器,比如 java.lang.Object這樣的類在各個類載入器下都是同一個類(只有當兩個類是由同一個類載入器載入的才有意義,這兩個類才相等。) 如果沒有雙親委派模型,由各個類載入器自行載入的話。當使用者自己編寫了一個 java.lang.Object類,那樣系統中就會出現多個 Object,這樣 Java 程式中最基本的行為都無法保證,程式會變的非常混亂。

各類載入器作用

  • Bootstartp ClassLoader : 載入核心api。
  • Extension ClassLoader : 載入出了基本 API 之外的一些擴充類。
  • App ClassLoader : 載入應用程式和程式設計師自定義的類。
  • Custom ClassLoader : 供使用者自定義載入class
    JAVA-大白話探索JVM-類載入器(一)
    ················ ················ ················

等等,說好的大白話呢

類載入器,顧名思義,載入.class的器,呃····,將就一下

JAVA-大白話探索JVM-類載入器(一)
載入過程中,並非順序載入,而是等需要使用到,就去主動載入。 就像人吃飯,我想吃炸雞,但是餐廳卻一直給我青菜,這很不科學,那怎麼辦。 我:老闆,來一份炸雞,那就預先主動去點(載入)炸雞。 然後就是雙親委託模型。 老闆:來了,老弟。 客戶要炸雞,那就要命令廚房下廚,廚房發現沒雞(未被載入此類),怎麼辦?開始委託老闆要雞。 廚房馬上找老闆,然後老闆在倉庫找找,也發現沒雞(也未被載入此類),怎麼辦?開始委託供應商要雞。 這就得找供應商生產雞了(載入.class)。 ε=(´ο`*)))唉,吃個炸雞這麼麻煩,不過看老闆那麼熱心。 下次來吃,這次廚房有雞了(此類已經載入,直接返回),炸雞也就很快上了。 至於好處。你會發現,我吃的雞都來自同一供應商(保證自己編寫的類屬於同一個)。 好了,結束了,下篇再講講類載入裝載過程。先去吃吃炸雞咯~~~

個人部落格文章連結

www.ccode.live/bertonlee/l…

歡迎關注

歡迎關注公眾號“碼上開發”,每天分享最新技術資訊

JAVA-大白話探索JVM-類載入器(一)

相關文章