Java語言的一個很是重要的特色就是與平臺的無關性。而使用Java虛擬機是實現這一特色的關鍵。JVM是Java Virtual Machine(Java虛擬機)的縮寫,Java程序編譯後,產生.class文件,並非在CPU上執行,而是由JVM執行,JVM屏蔽了與具體平臺相關的信息,針對平臺開發其對應的解釋器,Java 虛擬機在執行字節碼時,把字節碼解釋成具體平臺上的機器指令執行。所以實現java平臺無關性。從而實現 一次編譯,處處運行。java
不急不急。
先聽我講個故事,從前有座山,山裏有座廟···,呃…,錯了,再來
從前有名學生,name叫貓貓,手持iphone6,戴着耳機,在課上偷聽歌。~囧架架,囧架架。
以後再因緣巧合之下,貓貓榮獲7p,那麼,問題來了,還能繼續使用該耳機嗎? 固然是沒法使用。
當你使用6的耳機時,卻發現怎麼也沒法使用在iphone7p上(頭尾不對),那怎麼辦??這時轉接口就派上用場了。
只需將耳機線完美插入洞裏,而後就能夠在課上偷偷聽歌了。。。呃…
同理,JVM 能夠理解爲「轉接口」,JVM 就是爲了方便開發者在編譯完java代碼後,在不一樣系統均可運行。作到一次編譯,處處運行。
囧架架~~囧囧架程序員
JVM = 類加載器 classloader + 執行引擎 execution engine + 運行時數據區域 runtime data areaapi
話很少說,直接上圖
我知道看不懂。我也看不懂。哈哈…
不急,先知道是幹啥用的。緩存
指將類.class文件中的二進制數據讀入到內存中,將其放在運行時數據區的方法區內,而後堆中建立一個java.lang.Class對象,用來封裝類在方法區的數據結構。
注:類加載器並不須要等到某個類被「首次主動使用」時再加載它,JVM規範容許類加載器在預料某個類將要被使用時就預先加載它安全
講類加載器,必定要知道的機制
數據結構
雙親委派模型中除了啓動類加載器以外其他都須要有本身的父類加載器,如圖中Bootstartp ClassLoader。子類加載器和父類加載器不是以繼承的關係來實現,而是經過組合關係來複用父加載器的代碼。iphone
每一個類加載器都有本身的加載緩存,當一個類被加載了之後就會放入緩存, 等下次加載的時候就能夠直接返回了。
雙親委派的好處 : 主要是爲了安全性,避免用戶本身編寫的類動態替換 Java 的一些核心類,因爲每一個類加載都會通過最頂層的啓動類加載器,好比 java.lang.Object這樣的類在各個類加載器下都是同一個類(只有當兩個類是由同一個類加載器加載的纔有意義,這兩個類才相等。)
若是沒有雙親委派模型,由各個類加載器自行加載的話。當用戶本身編寫了一個 java.lang.Object類,那樣系統中就會出現多個 Object,這樣 Java 程序中最基本的行爲都沒法保證,程序會變的很是混亂。spa
················
················
················3d
類加載器,顧名思義,加載.class的器,呃····,將就一下
加載過程當中,並不是順序加載,而是等須要使用到,就去主動加載。
就像人吃飯,我想吃炸雞,可是餐廳卻一直給我青菜,這很不科學,那怎麼辦。
我:老闆,來一份炸雞,那就預先主動去點(加載)炸雞。
而後就是雙親委託模型。
老闆:來了,老弟。
客戶要炸雞,那就要命令廚房下廚,廚房發現沒雞(未被加載此類),怎麼辦?開始委託老闆要雞。
廚房立刻找老闆,而後老闆在倉庫找找,也發現沒雞(也未被加載此類),怎麼辦?開始委託供應商要雞。
這就得找供應商生產雞了(加載.class)。
ε=(´ο`*)))唉,吃個炸雞這麼麻煩,不過看老闆那麼熱心。
下次來吃,此次廚房有雞了(此類已經加載,直接返回),炸雞也就很快上了。
至於好處。你會發現,我吃的雞都來自同一供應商(保證本身編寫的類屬於同一個)。code
版權聲明:本文爲不會代碼的小白原創文章,轉載需添加小白地址 :https://www.ccode.live/bertonlee/list/6?from=art