JVM基礎學習(自我記錄向)
JVM
(圖片來源於網路)
JVM體系結構
(圖片來源於網路)
棧區不會發生垃圾回收的原因:垃圾回收回收的是無任何引用的物件佔據的記憶體空間而不是物件本身,即垃圾回收只會負責釋放那些物件佔有的記憶體。
jvm架構圖
(圖片來源於網路)
一個類載入到jvm的一個基本結構
(圖片來源於網路)
類是模板,物件是一個具體的例項,類通過new來例項化物件。圖中car1,car2,car3在棧裡面,它們的例項和具體的資料 在堆裡面,棧只是一個引用的地址。
JVM類載入器
-
Bootstrap ClassLoader 啟動類載入器
-
Extention ClassLoader 標準擴充套件類載入器
-
Application ClassLoader 應用類載入器(又可以叫做類載入器)
-
User ClassLoader 使用者自定義類載入器
一個類載入器可以通過getParent方法呼叫它的父類載入器。
(圖片來源於網路)
談到類載入就要說說java類載入器的雙親委派機制
-
當AppClassLoader載入class時 不會自己去嘗試載入這個類 而把類委派給父類載入器ExtClassLoader載入
-
當ExtClassLoader載入class時 不會自己去嘗試載入這個類 而把類委派給父類載入器BootStrapClassLoader載入
-
如BootStrapClassLoader載入失敗(如在$JAVA_HOME/jre/lib中未找到該class) 會使用ExtClassLoader載入
-
若ExtClassLoader載入失敗 會使用AppClassLoader載入 如AppClassLoader載入失敗 則丟擲異常ClassNotFoundException
(來自https://blog.csdn.net/setlilei/article/details/106741138)
簡單來說,就是類載入器收到了類載入的請求後,將這個請求向上委託給父類載入器去完成,一直向上委託,直到啟動類載入器。啟動類載入器檢查是否能載入這個類,能載入就結束,使用當前的載入器,否則丟擲異常,通知子載入器去載入。不斷重複上一步。
雙親委派機制的優點(為什麼採用雙親委派機制)
通過委派的方式,可以避免類的重複載入(當父載入器已經載入過某一個類時,子載入器就不會再重新載入這個類)。
安全 因為Bootstrap ClassLoader在載入的時候,只會載入JAVA_HOME中的jar包裡面的類,那麼這個類是不會被隨意替換的。除非修改了本地jar包中的類。