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

JVM???

Java語言的一個很是重要的特色就是與平臺的無關性。而使用Java虛擬機是實現這一特色的關鍵。JVM是Java Virtual Machine(Java虛擬機)的縮寫,Java程序編譯後,產生.class文件,並非在CPU上執行,而是由JVM執行,JVM屏蔽了與具體平臺相關的信息,針對平臺開發其對應的解釋器,Java 虛擬機在執行字節碼時,把字節碼解釋成具體平臺上的機器指令執行。所以實現java平臺無關性。從而實現 一次編譯,處處運行。java

因此,JVM是啥??

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

只需將耳機線完美插入洞裏,而後就能夠在課上偷偷聽歌了。。。呃…
同理,JVM 能夠理解爲「轉接口」,JVM 就是爲了方便開發者在編譯完java代碼後,在不一樣系統均可運行。作到一次編譯,處處運行。
囧架架~~囧囧架程序員

JVM = 類加載器 classloader + 執行引擎 execution engine + 運行時數據區域 runtime data areaapi

如今咱們知道JVM是什麼了,那來講說看是編譯後的.class是怎麼加載到內存中的。

類加載器

話很少說,直接上圖

我知道看不懂。我也看不懂。哈哈…

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

類加載器

做用:裝載.class文件

指將類.class文件中的二進制數據讀入到內存中,將其放在運行時數據區的方法區內,而後堆中建立一個java.lang.Class對象,用來封裝類在方法區的數據結構。
注:類加載器並不須要等到某個類被「首次主動使用」時再加載它,JVM規範容許類加載器在預料某個類將要被使用時就預先加載它安全

講類加載器,必定要知道的機制
數據結構

雙親委派模型(Parent Delegation Model)

雙親委派模型中除了啓動類加載器以外其他都須要有本身的父類加載器,如圖中Bootstartp ClassLoader。子類加載器和父類加載器不是以繼承的關係來實現,而是經過組合關係來複用父加載器的代碼。iphone

過程

  1. 當前 ClassLoader 首先從本身已經加載的類中查詢是否此類已經加載,若是已經加載則直接返回原來已經加載的類。沒有的話,就會收到了類加載請求,本身不會首先加載,而是委派給父加載器進行加載,每一個層次的加載器都是這樣。直到Bootstartp ClassLoader
每一個類加載器都有本身的加載緩存,當一個類被加載了之後就會放入緩存,
等下次加載的時候就能夠直接返回了。

好處

雙親委派的好處 : 主要是爲了安全性,避免用戶本身編寫的類動態替換 Java 的一些核心類,因爲每一個類加載都會通過最頂層的啓動類加載器,好比 java.lang.Object這樣的類在各個類加載器下都是同一個類(只有當兩個類是由同一個類加載器加載的纔有意義,這兩個類才相等。)
若是沒有雙親委派模型,由各個類加載器自行加載的話。當用戶本身編寫了一個 java.lang.Object類,那樣系統中就會出現多個 Object,這樣 Java 程序中最基本的行爲都沒法保證,程序會變的很是混亂。spa

各種加載器做用

Bootstartp ClassLoader : 加載核心api。

Extension ClassLoader : 加載出了基本 API 以外的一些拓展類。

App ClassLoader : 加載應用程序和程序員自定義的類。

Custom ClassLoader : 供用戶自定義加載class


················
················
················3d

等等,說好的大白話呢

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

加載過程當中,並不是順序加載,而是等須要使用到,就去主動加載。
就像人吃飯,我想吃炸雞,可是餐廳卻一直給我青菜,這很不科學,那怎麼辦。
我:老闆,來一份炸雞,那就預先主動去點(加載)炸雞。
而後就是雙親委託模型。
老闆:來了,老弟。
客戶要炸雞,那就要命令廚房下廚,廚房發現沒雞(未被加載此類),怎麼辦?開始委託老闆要雞。
廚房立刻找老闆,而後老闆在倉庫找找,也發現沒雞(也未被加載此類),怎麼辦?開始委託供應商要雞。
這就得找供應商生產雞了(加載.class)。
ε=(´ο`*)))唉,吃個炸雞這麼麻煩,不過看老闆那麼熱心。
下次來吃,此次廚房有雞了(此類已經加載,直接返回),炸雞也就很快上了。
至於好處。你會發現,我吃的雞都來自同一供應商(保證本身編寫的類屬於同一個)。code

好了,結束了,下篇再講講類加載裝載過程。先去吃吃炸雞咯~~~

版權聲明:本文爲不會代碼的小白原創文章,轉載需添加小白地址 :https://www.ccode.live/bertonlee/list/6?from=art

歡迎關注

歡迎關注公衆號「碼上開發」,天天分享最新技術資訊

相關文章
相關標籤/搜索