JVM_02 类加载器子系统
①. 類的加載(掌握)
簡述類的加載過程(掌握)
當程序要使用某個類時,如果該類還未被加載到內存中,則系統會通過類的加載、類的鏈接、類的初始化這三個步驟來對類進行初始化。 如果不出現意外,JVM將會連續完成這三個步驟,所以有時也把這三個步驟統稱為類加載或者初始化
什么是類的加載(Loading)
類的加載指的是將類的.class文件中的二進制數據讀取到內存中,存放在運行時數據區的方法區中,并創建一個大的Java.lang.Class對象,用來封裝方法區內的數據結構
鏈接(Linking)
-
①. 驗證:確保Class文件的字節流中包含信息符合當前虛擬機要求,保證被加載類的正確性
-
②. 準備:為類變量分配內存并且設置該類變量的默認初始化值 不會為實例變量分配初始化
-
③. 解析: (將常量池中的符號引號轉換為直接引用的過程)
解釋什么是符號引號和直接引用
教室里有個空的位子沒坐人,座位上邊牌子寫著小明的座位(符號引用),后來小明進來坐下去掉牌子(符號引用換成直接引用)
-
①. 為類變量賦予正確的初始化值
-
②. 初始化階段就是執行類構造器方法< clinit >()的過程
-
③. 類的初始化階段就是執行類的構造方法(clinit)的過程 (構造器方法中指令按語句在源文件中出現的順序執行)
-
④. < clinit > 不同于類的構造器,有靜態變量或static{ } 代碼塊 那么字節碼文件就有這個方法
-
⑤. 若該類具有父類,Jvm會保證子類的< clinit >() 執行前,父類的< clinit >() 已經執行完成
②. 類加載器的介紹
-
①. JVM支持兩種類型的類加載器,分別為引導類加載器(Bootstrap
ClassLoader)和自定義類加載器(User-Defined ClassLoader) -
②.從概念上來講,自定義類加載器一般指的是程序中由開發人員自定義的一類類加載器,但是Java虛擬機規范并沒有這么定義,而是將所有派生于抽象類ClassLoader的類加載器都劃分為自定義類加載器
-
③. sum.misc.Launcher:它是一個java虛擬機的入口應用
-
④. 無論類加載器的類型如何劃分,在程序中我們常見的類加載器始終只有3個,如下所示:
-
①. 這個類加載使用C/C++語言實現的,嵌套在JVM內部
-
②.它用來加載Java的核心類庫(JAVA_HOME/jre/lib/rt.jar、resource.jar或sum.boot.class.path路徑下的內容),用于提供JVM自身需要的類
-
③. 并不繼承自java.lang.ClassLoader,沒有父加載器
-
④. 加載擴展類和應用程序類加載器,并指定為他們的父類加載器
-
⑤. 由于安全考慮,Bootstrap啟動類加載器只加載包名為java、javax、sun等開頭的類
-
①. Java語言編寫,由sum.music.Launcher$ExtClassLoader實現
-
②. 派生于ClassLoader類
-
③.父類加載器為啟動類加載器
-
④.從java.ext.dirs系統屬性所指定的目錄中加載類庫,或從JDK的安裝目錄的jre/lib/ext子目錄(擴展目錄)下加載類庫。如果用戶創建的JAR放在此目錄下,也貴自動由擴展類加載器加載
-
①. java語言編寫,由sum.misc.Launcher$AppClassLoader實現
-
②. 派生于ClassLoader類
-
③. 父類加載器為擴展類加載器
-
④. 它負責加載環境變量classpath或系統屬性java.class.path指定路徑下的類庫
-
⑤. 該類加載是程序中默認的類加載器,一般來說,Java應用的類都是由它來完成加載
-
⑥. 通過ClassLoader#getSystemClassLoader()方法可以獲取到該類加載器
-
①. 在Java的日常應用程序開發中,類的加載幾乎是由上述3種類加載器相互配合執行的,在必要時,我們換可以自定義類加載器,來定制類的加載方式
-
②. 如果獲取ClassLoader
-
①. 工作原理
-
②. 優勢:
沙箱安全機制 (掌握)
如何判斷兩個Class對象是否相同
①. 相同必須的兩個條件如下:
②. JVM必須知道一個類型是由啟動加載器加載還是用戶類加載器加載的。如果一個類型是又用戶類加載器加載的,那么JVM會將這個類加載器的一個引用作為類型信息的一部分保存在方法區中。
總結
以上是生活随笔為你收集整理的JVM_02 类加载器子系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 5000字干货原创 | APP版本迭代如
- 下一篇: 字节跳动被爆商业化部门大量裁员