天天看點

JVM基礎學習(自我記錄向)

JVM基礎學習(自我記錄向)

(圖檔來源于網絡)

JVM基礎學習(自我記錄向)

棧區不會發生垃圾回收的原因:垃圾回收回收的是無任何引用的對象占據的記憶體空間而不是對象本身,即垃圾回收隻會負責釋放那些對象占有的記憶體。

JVM基礎學習(自我記錄向)

一個類加載到jvm的一個基本結構

JVM基礎學習(自我記錄向)

類是模闆,對象是一個具體的執行個體,類通過new來執行個體化對象。圖中car1,car2,car3在棧裡面,它們的執行個體和具體的資料 在堆裡面,棧隻是一個引用的位址。

bootstrap classloader 啟動類加載器

extention classloader 标準擴充類加載器

application classloader 應用類加載器(又可以叫做類加載器)

user classloader 使用者自定義類加載器

一個類加載器可以通過getparent方法調用它的父類加載器。

JVM基礎學習(自我記錄向)

談到類加載就要說說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包中的類。

繼續閱讀