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

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

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的器,呃····,將就一下

個人部落格文章連結
歡迎關注
歡迎關注公眾號“碼上開發”,每天分享最新技術資訊
