【狂神說Java】JVM快速入門篇

雙親委派機(jī)制
java是運(yùn)行在java虛擬機(jī)(JVM)中的,在java文件編譯成class字節(jié)碼文件后,由ClassLoader(類加載器)負(fù)責(zé)講這些class文件給加載到JVM中去運(yùn)行
JVM提供了三層的ClassLoader:
- BootStrapClassLoader:主要是負(fù)責(zé)加載核心的類庫(如:java.lang.*等)構(gòu)造ExtClassLoader和AppClassLoader。(主要是rt.jar,charset.jar等包)
- ExtClassLoader:主要負(fù)責(zé)加載jre/lib/ext目錄下的一些擴(kuò)展的jar。
- AppClassLoader:主要負(fù)責(zé)加載應(yīng)用程序的主函數(shù)。
那如果有一個(gè)我們寫的Hello.java編譯成的Hello.class文件,它是如何被加載到JVM中的呢?
java.lang包下的loadClass方法:
public Class<?> loadClass(String name) throws ClassNotFoundException { ??return loadClass(name, false); } //??????-----??----- protected Class<?> loadClass(String name, boolean resolve) ??throws ClassNotFoundException { ????// 首先,檢查是否已經(jīng)被類加載器加載過 ????Class<?> c = findLoadedClass(name); ????if (c == null) { ??????try { ????????// 存在父加載器,遞歸的交由父加載器 ????????if (parent != null) { ??????????c = parent.loadClass(name, false); ???????} else { ??????????// 直到最上面的Bootstrap類加載器 ??????????c = findBootstrapClassOrNull(name); ???????} ?????} catch (ClassNotFoundException e) { ????????// ClassNotFoundException thrown if class not found ????????// from the non-null parent class loader ?????} ??????if (c == null) { ????????// If still not found, then invoke findClass in order ????????// to find the class. ????????c = findClass(name); ?????} ???} ????return c; }
如果沒有加載過,會一直向上提交,直到頂層的BootStrapClassLoader,再向下檢查是否能加載該類。如果一直到最底層都沒有任何加載器能加載此類,則拋出ClassNotFoundException。
類加載生命周期
- 加載-將.class文件從磁盤讀到內(nèi)存
- 連接
- 2.1 驗(yàn)證-驗(yàn)證字節(jié)碼的正確性。
- 2.2 準(zhǔn)備-給類的靜態(tài)變量分配內(nèi)存,并賦予默認(rèn)值
- 2.3 解析-類裝載器裝入類所引用的其他所有類。
- 初始化-為類的靜態(tài)變量賦予正確的初始值,上述的準(zhǔn)備階段為靜態(tài)變量賦予的是虛擬機(jī)默認(rèn)的初始值,此處賦予的才是程序編寫著為變量分配的真正的初始值,執(zhí)行靜態(tài)代碼塊
- 使用
- 卸載
標(biāo)簽: