Class Loading Linking Initalizing
??????簡單說上次講到了class文件的格式蚀之,這次講的是class文件怎么放進內(nèi)存的。
??????class 文件怎么進入到內(nèi)存有三大步。
1.第一大步叫Loading
2.第二大步叫Linking
?? ????linking又分為三小步识啦,第一小步verfication箕憾,第二小步preparation擂煞,第三小步resolution
3.第三大步叫Initlalizing
首先來看看Loading的過程诬辈,解釋下每一步是什么意思
??????首先Loading酵使,是把一個class文件load內(nèi)存裝載到內(nèi)存里面去,他本來是class文件上的一個一個的二進制自晰,一個一個的字節(jié)凝化,裝完之后就是接下來Linking稍坯。
Linking的過程分為三小步
(1).verification是校驗裝進來的class文件是不是符合class文件的標準酬荞。
(2).preparation是把class文件靜態(tài)變量賦默認值搓劫,不是賦初始值。
(3)resolution是把class文件常量池里面用到的符號引用混巧,要給它轉(zhuǎn)換為直接內(nèi)存地址枪向,直接可以訪問到的內(nèi)容。
Initlalizing指的是靜態(tài)變量這時候賦值才成為初始值咧党。
如上圖所示類加載器秘蛔,首先第一點jvm本身有一個類加載器的層次,這個類加載器本身就是一個普通的class傍衡,jvm有一個類加載器的層次分別來加載不同的class深员,jvm所有的class都是被類加載器加載到內(nèi)存的,那么這個類加載器可以叫做classloader蛙埂。
每一個class在java虛擬機里面到內(nèi)存里面任何一個class都是被classloader內(nèi)存的倦畅,那么這個classloader其實就是頂級一個父類,這個父類叫做classloader绣的,他是一個abstract抽象類叠赐,相當于這個類被領到內(nèi)存里面去了,他一定是classloader這個類的子類屡江,如果想知道class是被誰弄到內(nèi)存里面去的芭概,其實很簡單,就是下面這段代碼
System.out.println(String.class.getClassLoader());
第一個類加載器層次
類加載的加載過程惩嘉,加載過程是分成不同的層次來加載罢洲,不同的類加載器來加載不同的class,最頂層的是Bootstrap
第二個類加載器層次
這個是Extension加載器拓展類文黎,加載拓展包里的各種各樣文件奏路,這些拓展包在jdk安裝目錄jre/lib/ext下的jar
第三個類加載器層次
這個就是平時用的加載器application,它用于加載classpath指定的內(nèi)容
第四個類加載器層次
這個就是自定義加載器classloader臊诊,加載自己有定義的加載器
CustomClassLoader父類加載器是>application父類加載器是>Extension父類加載器是>Boostrap,
且其他不是繼承鸽粉,不要混淆.
這里就會引出雙親委派機制,這也是類加載器面試題必問的問題抓艳,下一章節(jié)在自習講解吧