一送朱、類裝載子系統(tǒng)
類裝載子系統(tǒng)加載.class文件,把加載后的類信息存放在方法區(qū)中趾访,classloader只負責加載,運行需要通過執(zhí)行引擎來執(zhí)行
加載過程
加載——連接——初始化
加載
- 預加載:加載rt.jar,里面是一些常用的類lang包和io包
- 運行時加載
1工育、獲取.class文件的二進制流
2、將類信息搓彻、靜態(tài)變量如绸、字節(jié)碼嘱朽、常量這些.class文件中的內容放入方法區(qū)中
3、在內存中生成一個代表這個.class文件的java.lang.Class對象怔接,作為方法區(qū)這個類的各種數(shù)據(jù)的訪問入口搪泳。一般
這個Class是在堆里的,不過HotSpot虛擬機比較特殊扼脐,這個Class對象是放在方法區(qū)中的
連接
1岸军、驗證
為了確保.class文件的字節(jié)流中包含的信息符合當前虛擬機的要求,并且不會危害虛擬機自身的安全瓦侮。
2艰赞、準備
準備階段是正式為類變量分配內存并設置其初始值的階段,這些變量所使用的內存都將在方法區(qū)中分配
3肚吏、解析
解析階段是虛擬機將常量池內的符號引用替換為直接引用的過程方妖。
- 直接引用可以是直接指向目標的指針、相對偏移量或是一個能間接定位到目標的句柄罚攀。如果有了直接引用党觅,那引用的目標必定已經(jīng)存在在內存中了。
初始化
靜態(tài)變量和靜態(tài)代碼塊的賦值斋泄。
初始化階段就是執(zhí)行類構造器<clinit>()方法的過程杯瞻。<clinit>()方法是由編譯器自動收集類中的所有類變量的賦值動作和靜態(tài)語句塊(static{}塊) 中的 語句合并產生的, 編譯器收集的順序是由語句在源文件中出現(xiàn)的順序決定的炫掐, 靜態(tài)語句塊中只能訪問 到定義在靜態(tài)語句塊之前的變量.魁莉。
Java虛擬機會保證在子類的<clinit>()方法執(zhí)行前, 父類的()方法已經(jīng)執(zhí)行 完畢卒废。
二沛厨、類加載器
- 作用:類的加載指的是將類的.class文件中的二進制數(shù)據(jù)讀入到內存中,將其放在運行時數(shù)據(jù)區(qū)的方法區(qū)內摔认,然后在創(chuàng)建一個java.lang.Class對象逆皮,用來封裝類在方法區(qū)內的數(shù)據(jù)結構
- 分類
1.啟動類加載器:加載rt.jar
2.擴展類加載器:加載/lib/ext目錄下jar包
3.系統(tǒng)類加載器:默認的類加載器,應用程序中的類由它加載
三参袱、雙親委派
- 如果一個類加載器收到類加載的請求电谣,它不會自己去嘗試加載這個類,而是把這個請求委派給父類加載器完成抹蚀。每個類加載器都是如此剿牺,只有當父加載器在自己的搜索范圍內找不到指定類時(即 ClassNotFoundException ),子加載器才會嘗試自己去加載