首先復(fù)習(xí)了一下jvm運行時數(shù)據(jù)區(qū)
記憶那幅圖吧
- 線程共享部分 堆內(nèi)存、方法區(qū)
- 線程獨占部分 虛擬機棧场刑、本地方法棧辣之、程序計數(shù)器
1.類加載器
- bootstrap加載器 基礎(chǔ)加載器 負(fù)責(zé)加載jre_home/jre/lib下的類
- extendClassLoader 負(fù)責(zé)加載jre_home/jre/lib/ext下的類
- appClassLoader 負(fù)責(zé)加載程序員自己編寫的各個java程序的類战得,具體就是加載各個java程序的"java.class.path"屬性 指定的路徑下的類喷斋,或者運行java命令式附帶的-cp參數(shù)指定的地址
2.查看類加載器
任何一個對象,都可以使用getClassLoader這個方法來查看到它對應(yīng)的類加載器茧彤,extendClassLoader或者appClassLoader或者自定義的ClassLoader骡显,如果是bootstrapLoader的話,那么輸出的是null,因為bootstrapLoader是由c/C++實現(xiàn)的惫谤,它并不是一個java類
3.JVM如何知道類在何方
- String這種基礎(chǔ)類的話壁顶,就在環(huán)境變量jre_home下的jre/lib
- jdk的其他類的話,就在環(huán)境變量jre_home下的jre/lib/ext
- 用戶應(yīng)用程序的話溜歪,去讀取"java.class.path"這個屬性若专,獲取路徑getProperty("java.class.path")
- ips命令
ips命令可以看到本機有什么java進(jìn)程 - jcmd命令
jcmd pid VM.system_properties 可以看到某一個java線程的屬性,其中就包括"java.class.path"這個屬性
4.類不會重復(fù)加載
加載器實例+package+類名 可以唯一確定一個類蝴猪,jvm不會對同一個類進(jìn)行重復(fù)加載
驗證方法:寫一個while循環(huán)调衰,不停地用類類加載機制加載類,期間對源碼進(jìn)行修改拯腮,發(fā)現(xiàn)修改并不生效
5.卸載類
什么時候類會被卸載
要滿足2個條件
- 類的所有實例對象被GC
- 類的ClassLoader實例被GC
-verbose:class 參數(shù)窖式,可以輸出類加載和卸載日志
課后作業(yè):如何在idea設(shè)置VM_Option 和-verbose
6.雙親委派模型
記住那幅圖:appClassLoader蚁飒、extClassLoader动壤、bootStrapClassLoader由下至上排列,有一順時針的箭頭鏈接三個類加載器淮逻,向上是委派琼懊、向下是查詢
核心:父加載器無法執(zhí)行類加載任務(wù)時,才由自己完成