JAVA-大白話探索JVM-類加載器(一)
原文出處:https://www.ccode.live/bertonlee/list/6
JVM???
Java語言的一個非常重要的特點就是與平臺的無關性。而使用Java虛擬機是實現這一特點的關鍵。JVM是Java Virtual Machine(Java虛擬機)的縮寫,Java程序編譯後,產生.class文件,並不是在CPU上執行,而是由JVM執行,JVM屏蔽了與具體平臺相關的信息,針對平臺開發其對應的解釋器,Java 虛擬機在執行字節碼時,把字節碼解釋成具體平臺上的機器指令執行。因此實現java平臺無關性。從而實現 一次編譯,到處運行。
所以,JVM是啥??
不急不急。
先聽我講個故事,從前有座山,山裏有座廟···,呃…,錯了,再來
從前有名學生,name叫貓貓,手持iphone6,戴著耳機,在課上偷聽歌。~囧架架,囧架架。
之後再因緣巧合之下,貓貓榮獲7p,那麽,問題來了,還能繼續使用該耳機嗎? 當然是無法使用。
當你使用6的耳機時,卻發現怎麽也無法使用在iphone7p上(頭尾不對),那怎麽辦??這時轉接口就派上用場了。
只需將耳機線完美插入洞裏,然後就可以在課上偷偷聽歌了。。。呃…
同理,JVM 可以理解為“轉接口”,JVM 就是為了方便開發者在編譯完java代碼後,在不同系統都可運行。做到一次編譯,到處運行。
囧架架~~囧囧架
JVM = 類加載器 classloader + 執行引擎 execution engine + 運行時數據區域 runtime data area
現在我們知道JVM是什麽了,那來說說看是編譯後的.class是怎麽加載到內存中的。
類加載器
話不多說,直接上圖
我知道看不懂。我也看不懂。哈哈…
不急,先知道是幹啥用的。
類加載器
作用:裝載.class文件
指將類.class文件中的二進制數據讀入到內存中,將其放在運行時數據區的方法區內,然後堆中創建一個java.lang.Class對象,用來封裝類在方法區的數據結構。
註:類加載器並不需要等到某個類被“首次主動使用”時再加載它,JVM規範允許類加載器在預料某個類將要被使用時就預先加載它
講類加載器,一定要知道的機制
雙親委派模型(Parent Delegation Model)
雙親委派模型中除了啟動類加載器之外其余都需要有自己的父類加載器,如圖中Bootstartp ClassLoader。子類加載器和父類加載器不是以繼承的關系來實現,而是通過組合關系來復用父加載器的代碼。
過程
- 當前 ClassLoader 首先從自己已經加載的類中查詢是否此類已經加載,如果已經加載則直接返回原來已經加載的類。沒有的話,就會收到了類加載請求,自己不會首先加載,而是委派給父加載器進行加載,每個層次的加載器都是這樣。直到Bootstartp ClassLoader
每個類加載器都有自己的加載緩存,當一個類被加載了以後就會放入緩存, 等下次加載的時候就可以直接返回了。
好處
雙親委派的好處 : 主要是為了安全性,避免用戶自己編寫的類動態替換 Java 的一些核心類,由於每個類加載都會經過最頂層的啟動類加載器,比如 java.lang.Object這樣的類在各個類加載器下都是同一個類(只有當兩個類是由同一個類加載器加載的才有意義,這兩個類才相等。)
如果沒有雙親委派模型,由各個類加載器自行加載的話。當用戶自己編寫了一個 java.lang.Object類,那樣系統中就會出現多個 Object,這樣 Java 程序中最基本的行為都無法保證,程序會變的非常混亂。
各類加載器作用
Bootstartp ClassLoader : 加載核心api。
Extension ClassLoader : 加載出了基本 API 之外的一些拓展類。
App ClassLoader : 加載應用程序和程序員自定義的類。
Custom ClassLoader : 供用戶自定義加載class
················
················
················
等等,說好的大白話呢
類加載器,顧名思義,加載.class的器,呃····,將就一下
加載過程中,並非順序加載,而是等需要使用到,就去主動加載。
就像人吃飯,我想吃炸雞,但是餐廳卻一直給我青菜,這很不科學,那怎麽辦。
我:老板,來一份炸雞,那就預先主動去點(加載)炸雞。
然後就是雙親委托模型。
老板:來了,老弟。
客戶要炸雞,那就要命令廚房下廚,廚房發現沒雞(未被加載此類),怎麽辦?開始委托老板要雞。
廚房馬上找老板,然後老板在倉庫找找,也發現沒雞(也未被加載此類),怎麽辦?開始委托供應商要雞。
這就得找供應商生產雞了(加載.class)。
ε=(′ο`*)))唉,吃個炸雞這麽麻煩,不過看老板那麽熱心。
下次來吃,這次廚房有雞了(此類已經加載,直接返回),炸雞也就很快上了。
至於好處。你會發現,我吃的雞都來自同一供應商(保證自己編寫的類屬於同一個)。
好了,結束了,下篇再講講類加載裝載過程。先去吃吃炸雞咯~~~
歡迎關註
歡迎關註公眾號“碼上開發”,每天分享最新技術資訊
JAVA-大白話探索JVM-類加載器(一)