一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - JVM類加載機(jī)制詳解

JVM類加載機(jī)制詳解

2020-08-14 15:55王中秋 Java教程

本文主要介紹了JVM類加載機(jī)制的相關(guān)知識(shí),具有很好的參考價(jià)值,下面跟著小編一起來看下吧

一、先看看編寫出的代碼的執(zhí)行過程:

JVM類加載機(jī)制詳解

二、研究類加載機(jī)制的意義

從上圖可以看出,類加載是Java程序運(yùn)行的第一步,研究類的加載有助于了解JVM執(zhí)行過程,并指導(dǎo)開發(fā)者采取更有效的措施配合程序執(zhí)行。

研究類加載機(jī)制的第二個(gè)目的是讓程序能動(dòng)態(tài)的控制類加載,比如熱部署等,提高程序的靈活性和適應(yīng)性。

三、類加載的一般過程

原理:雙親委托模式

1、尋找jre目錄,尋找jvm.dll,并初始化JVM;

2、產(chǎn)生一個(gè)Bootstrap Loader(啟動(dòng)類加載器);

3、Bootstrap Loader自動(dòng)加載Extended Loader(標(biāo)準(zhǔn)擴(kuò)展類加載器),并將其父Loader設(shè)為Bootstrap Loader。

4、Bootstrap Loader自動(dòng)加載AppClass Loader(系統(tǒng)類加載器),并將其父Loader設(shè)為Extended Loader。

5、最后由AppClass Loader加載HelloWorld類。

四、類加載器的特點(diǎn)

1、運(yùn)行一個(gè)程序時(shí),總是由AppClass Loader(系統(tǒng)類加載器)開始加載指定的類。

2、在加載類時(shí),每個(gè)類加載器會(huì)將加載任務(wù)上交給其父,如果其父找不到,再由自己去加載。

3、Bootstrap Loader(啟動(dòng)類加載器)是最頂級(jí)的類加載器了,其父加載器為null.

五、類加載器的獲取

很容易,看下面例子

?
1
2
3
4
5
6
7
8
9
10
public class HelloWorld {
   public static void main(String[] args) {
     HelloWorld hello = new HelloWorld();
     Class c = hello.getClass();
     ClassLoader loader = c.getClassLoader();
     System.out.println(loader);
     System.out.println(loader.getParent());
     System.out.println(loader.getParent().getParent());
   }
}

打印結(jié)果:

sun.misc.Launcher$AppClassLoader@19821f 
sun.misc.Launcher$ExtClassLoader@addbf1 
null 

從上面的結(jié)果可以看出,并沒有獲取到ExtClassLoader的父Loader,原因是Bootstrap Loader(啟動(dòng)類加載器)是用C語(yǔ)言實(shí)現(xiàn)的,找不到一個(gè)確定的返回父Loader的方式,于是就返回null。 

六、類的加載

類加載有三種方式:

1、命令行啟動(dòng)應(yīng)用時(shí)候由JVM初始化加載

2、通過Class.forName()方法動(dòng)態(tài)加載

3、通過ClassLoader.loadClass()方法動(dòng)態(tài)加載

三種方式區(qū)別比較大,看個(gè)例子就明白了:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package zhongqiu.common.base;
public class ClassLoadDemo {
 static {
 System.out.println("ClassLoadDemo靜態(tài)初始化塊執(zhí)行了!");
 }
 public static void main(String[] args) throws ClassNotFoundException {
 ClassLoader loader2 = ClassLoadDemo.class.getClassLoader();
 System.out.println(loader2);
 // 使用ClassLoader.loadClass()來加載類,不會(huì)執(zhí)行初始化塊
 // loader2.loadClass("zhongqiu.test.Test");
 // 使用Class.forName()來加載類,默認(rèn)會(huì)執(zhí)行初始化塊
 // Class.forName("zhongqiu.test.Test");
 // 使用Class.forName()來加載類,并指定ClassLoader,初始化時(shí)不執(zhí)行靜態(tài)塊
 Class.forName("zhongqiu.test.Test", false, loader2);
 }
}

七、自定義ClassLoader

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package zhongqiu.common.base.classload;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
public class MyClassLoader {
 @SuppressWarnings("resource")
 public static void main(String[] args)
  throws MalformedURLException, ClassNotFoundException, IllegalAccessException, InstantiationException {
 URL url = new URL("file:/D:/javaworkspace/JavaCommon/src/");
 ClassLoader myloader = new URLClassLoader(new URL[] { url });
 Class c = myloader.loadClass("zhongqiu.common.base.classload.Test");
 Test t3 = (Test) c.newInstance();
 }
}

在Java.lang包里有個(gè)ClassLoader類,ClassLoader 的基本目標(biāo)是對(duì)類的請(qǐng)求提供服務(wù),按需動(dòng)態(tài)裝載類和資源,只有當(dāng)一個(gè)類要使用(使用new 關(guān)鍵字來實(shí)例化一個(gè)類)的時(shí)候,類加載器才會(huì)加載這個(gè)類并初始化。一個(gè)Java應(yīng)用程序可以使用不同類型的類加載器。例如Web Application Server中,Servlet的加載使用開發(fā)商自定義的類加載器, java.lang.String在使用JVM系統(tǒng)加載器,Bootstrap Class Loader,開發(fā)商定義的其他類則由AppClassLoader加載。在JVM里由類名和類加載器區(qū)別不同的Java類型。因此,JVM允許我們使用不同的加載器加載相同namespace的java類,而實(shí)際上這些相同namespace的java類可以是完全不同的類。這種機(jī)制可以保證JDK自帶的java.lang.String是唯一的。

八、為什么要使用這種雙親委托模式呢?

因?yàn)檫@樣可以避免重復(fù)加載,當(dāng)父親已經(jīng)加載了該類的時(shí)候,就沒有必要子ClassLoader再加載一次。

考慮到安全因素,我們?cè)囅胍幌拢绻皇褂眠@種委托模式,那我們就可以隨時(shí)使用自定義的String來動(dòng)態(tài)替代java核心api中定義類型,這樣會(huì)存在非常大的安全隱患,而雙親委托的方式,就可以避免這種情況,因?yàn)镾tring已經(jīng)在啟動(dòng)時(shí)被加載,所以用戶自定義類是無法加載一個(gè)自定義的ClassLoader。

以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持服務(wù)器之家!

原文鏈接:http://www.cnblogs.com/wangzhongqiu/p/6417955.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲欧美一级夜夜爽w | 乳环贵妇堕落开发调教番号 | 奇米色88欧美一区二区 | 日本免费全黄一级裸片视频 | free性俄罗斯护士 | 亚州人成网在线播放 | 無码一区中文字幕少妇熟女网站 | 好奇害死猫在线观看 | 青草视频网站在线观看 | 99热这里只有精品国产在热久久 | 亚洲一成人毛片 | 成年看片免费高清观看 | 午夜亚洲福利 | 欧美在线一二三区 | 校园春色自拍偷拍 | 免费日本在线视频 | 亚洲国产精品自在自线观看 | 美女无内裤下部黄 | 艾秋麻豆果冻传媒老狼仙踪林 | 日本红色高清免费观看 | 精品日韩欧美一区二区三区在线播放 | 97精品国产自在现线免费观看 | 男人的天堂在线观看免费 | 久久九九精品国产自在现线拍 | 欧美成人免费观看久久 | 久久久无码精品亚洲欧美 | 日本视频观看 | 天天舔天天操天天干 | 国产区成人精品视频 | 我与么公激情性完整视频 | 青草草在线| 91av俱乐部| 久久精品中文字幕 | 欧美18一19性高清hd4k | 四虎在线精品免费高清在线 | 美女机机对机机的视频(免费) | 男人的天堂久久精品激情a 男人的天堂va | xvideoscom极品肌肉警察 | 99美国热| 香蕉精品高清在线观看视频 | yin娃sao货调教情趣用品店 |