照明網(wǎng)站建設(shè)新媒體
JVM構(gòu)成部分
類加載系統(tǒng)
類加載子系統(tǒng)的作用是將磁盤中的.class文件加載到內(nèi)存當(dāng)中。工作過(guò)程如下:
- 加載:通過(guò)類全路徑名獲取二進(jìn)制字節(jié)流;將這個(gè)二進(jìn)制字節(jié)流代表的數(shù)存儲(chǔ)構(gòu)轉(zhuǎn)化為方法區(qū)運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu);在內(nèi)存生成一個(gè)代表該類的Class對(duì)象,作為方法區(qū)該類的訪問入口。
- 鏈接
- 驗(yàn)證:驗(yàn)證加載的.class文件是否正確
- 準(zhǔn)備:為static對(duì)象分配內(nèi)存并賦零值
- 解析:符號(hào)引用(一組能描述目標(biāo)對(duì)象的字面量,如全路徑名)解析為直接引用(指向目標(biāo)對(duì)象的指針,相對(duì)偏移量或能間接定位目標(biāo)的句柄)
- 初始化:給對(duì)象賦真實(shí)的值
類加載器
用于實(shí)現(xiàn)類的加載動(dòng)作,對(duì)于任意一個(gè)類,都必須由加載它的類加載器和這個(gè)類本身一起共同確立其在Java虛擬機(jī)中的唯一性,每 一個(gè)類加載器,都擁有一個(gè)獨(dú)立的類名稱空間。比較兩個(gè)類是否“相等”,只有在這兩個(gè)類是由同一個(gè)類加載器加載的前提下才有意義,否則,即使這兩個(gè)類來(lái)源于同一個(gè) Class文件,被同一個(gè)Java虛擬機(jī)加載,只要加載它們的類加載器不同,那這兩個(gè)類就必定不相等。
- 引導(dǎo)類類加載器()
- BootstrapClassLoader:加載jre中ib目錄下的類
- 自定義類加載器(繼承ClassLoader抽象類)
- ExtClassLoader:加載jre中ib/ext目錄下的類
- AppClassLoader:加載當(dāng)前項(xiàng)目classpath下的類
雙親委派
工作過(guò)程是:類加載器收到了類加載的請(qǐng)求,它首先不會(huì)自己去嘗試加載這個(gè)類,而是把這個(gè)請(qǐng)求委派給父類加載器去完成,每一個(gè)層次的類加載器都是如此,因此所有的 加載請(qǐng)求最終都應(yīng)該傳送到最頂層的啟動(dòng)類加載器中,只有當(dāng)父加載器反饋?zhàn)约簾o(wú)法完成這個(gè)加載請(qǐng) 求(它的搜索范圍中沒有找到所需的類)時(shí),子加載器才會(huì)嘗試自己去完成加載。雙親委派實(shí)現(xiàn):
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {synchronized (getClassLoadingLock(name)) {// First, check if the class has already been loadedClass<?> c = findLoadedClass(name);if (c == null) {long t0 = System.nanoTime();try {if (parent != null) {c = parent.loadClass(name, false);} else {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.long t1 = System.nanoTime();c = findClass(name);// this is the defining class loader; record the statssun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;}}