<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    中文JAVA技術(shù)平等自由協(xié)作創(chuàng)造

    Java專題文章博客和開(kāi)源

    常用鏈接

    統(tǒng)計(jì)

    最新評(píng)論

    Java虛擬機(jī)類加載機(jī)制淺談

      Java語(yǔ)言是一種編譯后再經(jīng)過(guò)解釋器執(zhí)行的過(guò)程, 解釋器主要就是如何處理解釋Class文件的二進(jìn)制字節(jié)流。JVM主要包含三大核心部分:運(yùn)行時(shí)數(shù)據(jù)區(qū),類加載器和執(zhí)行引擎。
     
       虛擬機(jī)將描述類的數(shù)據(jù)從Class文件加載到內(nèi)存,并對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)、準(zhǔn)備、解析和初始化,最終就會(huì)形成可以被虛擬機(jī)使用的Java類型,這就是一個(gè)虛擬機(jī)的類加載機(jī)制。Java中的類是動(dòng)態(tài)加載的,只有在運(yùn)行期間使用到該類的時(shí)候,才會(huì)將該類加載到內(nèi)存中,Java依賴于運(yùn)行期動(dòng)態(tài)加載和動(dòng)態(tài)鏈接來(lái)實(shí)現(xiàn)類的動(dòng)態(tài)使用。
     
       一個(gè)類的整個(gè)生命周期如下:
     
     
       加載,驗(yàn)證,準(zhǔn)備,初始化和卸載在開(kāi)始的順序上是固定的,但是可以交叉進(jìn)行。
     
       在Java中,對(duì)于類有且僅有四種情況會(huì)對(duì)類進(jìn)行“初始化”。
     
       1)使用new關(guān)鍵字實(shí)例化對(duì)象的時(shí)候,讀取或設(shè)置一個(gè)類的靜態(tài)字段時(shí)候(除final修飾的static外),調(diào)用類的靜態(tài)方法時(shí)候,都只會(huì)初始化該靜態(tài)字段或者靜態(tài)方法所定義的類。
     
       2)使用reflect包對(duì)類進(jìn)行放射調(diào)用的時(shí)候,如果類沒(méi)有進(jìn)行初始化,則先要初始化該類
     
       3)當(dāng)初始化一個(gè)類的時(shí)候,如果其父類沒(méi)有初始化過(guò),則先要觸發(fā)其父類初始化。
     
       4)虛擬機(jī)啟動(dòng)的時(shí)候,會(huì)初始化一個(gè)有main方法的主類。
     
       注意:通過(guò)子類引用父類靜態(tài)字段,只會(huì)初始化父類不會(huì)初始化子類;通過(guò)數(shù)組定義來(lái)引用類,也不會(huì)觸發(fā)該類的初始化;常量在編譯階段會(huì)存入調(diào)用類的常量池中,本質(zhì)上沒(méi)有直接引用到定義常量的類,因此也不會(huì)觸發(fā)定義常量的類的初始化。
     
       一、類加載過(guò)程
     
       1、加載
     
       加載階段主要完成三件事,即通過(guò)一個(gè)類的全限定名來(lái)獲取定義此類的二進(jìn)制字節(jié)流,將這個(gè)字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu),在Java堆中生成一個(gè)代表此類的Class對(duì)象,作為訪問(wèn)方法區(qū)這些數(shù)據(jù)的入口。這個(gè)加載過(guò)程主要就是靠類加載器實(shí)現(xiàn)的,這個(gè)過(guò)程可以由用戶自定義類的加載過(guò)程。
     
       2、驗(yàn)證
     
       這個(gè)階段目的在于確保Class文件的字節(jié)流中包含信息符合當(dāng)前虛擬機(jī)要求,不會(huì)危害虛擬機(jī)自身安全。主要包括四種驗(yàn)證:
     
       文件格式驗(yàn)證:基于字節(jié)流驗(yàn)證,驗(yàn)證字節(jié)流是否符合Class文件格式的規(guī)范,并且能被當(dāng)前虛擬機(jī)處理。
     
       元數(shù)據(jù)驗(yàn)證:基于方法區(qū)的存儲(chǔ)結(jié)構(gòu)驗(yàn)證,對(duì)字節(jié)碼描述信息進(jìn)行語(yǔ)義驗(yàn)證。
     
       字節(jié)碼驗(yàn)證:基于方法區(qū)的存儲(chǔ)結(jié)構(gòu)驗(yàn)證,進(jìn)行數(shù)據(jù)流和控制流的驗(yàn)證。
     
       符號(hào)引用驗(yàn)證:基于方法區(qū)的存儲(chǔ)結(jié)構(gòu)驗(yàn)證,發(fā)生在解析中,是否可以將符號(hào)引用成功解析為直接引用。
     
       3、準(zhǔn)備
     
       僅僅為類變量(即static修飾的字段變量)分配內(nèi)存并且設(shè)置該類變量的初始值即零值,這里不包含用final修飾的static,因?yàn)閒inal在編譯的時(shí)候就會(huì)分配了,同時(shí)這里也不會(huì)為實(shí)例變量分配初始化。類變量會(huì)分配在方法區(qū)中,而實(shí)例變量是會(huì)隨著對(duì)象一起分配到Java堆中。
     
       4、解析
     
       解析主要就是將常量池中的符號(hào)引用替換為直接引用的過(guò)程。符號(hào)引用就是一組符號(hào)來(lái)描述目標(biāo),可以是任何字面量,而直接引用就是直接指向目標(biāo)的指針、相對(duì)偏移量或一個(gè)間接定位到目標(biāo)的句柄。有類或接口的解析,字段解析,類方法解析,接口方法解析。
     
       這里要注意如果有一個(gè)同名字段同時(shí)出現(xiàn)在一個(gè)類的接口和父類中,那么編譯器一般都會(huì)拒絕編譯。
     
       5、初始化
     
       初始化階段依舊是初始化類變量和其他資源,這里將執(zhí)行用戶的static字段和靜態(tài)語(yǔ)句塊的賦值操作。這個(gè)過(guò)程就是執(zhí)行類構(gòu)造器方法的過(guò)程。
     
       方法是由編譯器收集類中所有類變量的賦值動(dòng)作和靜態(tài)語(yǔ)句塊的語(yǔ)句生成的,類構(gòu)造器方法與實(shí)例構(gòu)造器方法不同,這里面不用顯示的調(diào)用父類的方法,父類的方法會(huì)自動(dòng)先執(zhí)行于子類的方法。即父類定義的靜態(tài)語(yǔ)句塊和靜態(tài)字段都要優(yōu)先子類的變量賦值操作。
     
       二、類加載器
     
       1、類加載器的分類
     
       啟動(dòng)類加載器(Bootstrap ClassLoader): 主要負(fù)責(zé)加載lib目錄中的,或是-Xbootclasspath參數(shù)指定的路徑中的,并且可以被虛擬機(jī)識(shí)別(僅僅按照文件名識(shí)別的)的類庫(kù)到虛擬機(jī)內(nèi)存中。它加載的是System.getProperty("sun.boot.class.path")所指定的路徑或jar。
     
       擴(kuò)展類類加載器(Extension ClassLoader):主要負(fù)責(zé)加載libext目錄中的,或者被java.ext.dirs系統(tǒng)變量所指定的路徑中的所有類庫(kù)。它加載的是托福答案
     
       System.getProperty("java.ext.dirs")所指定的路徑或jar。
     
       應(yīng)用程序類加載器(Application ClassLoader):也叫系統(tǒng)類加載器,主要負(fù)責(zé)加載ClassPath路徑上的類庫(kù),如果應(yīng)用程序沒(méi)有自定義自己類加載器,則這個(gè)就是默認(rèn)的類加載器。
     
       它加載的是System.getProperty("java.class.path")所指定的路徑或jar。
     
       2、類加載器的特點(diǎn)
     
       1)運(yùn)行一個(gè)程序時(shí),總是由Application Loader(系統(tǒng)類加載器)開(kāi)始加載指定的類。
     
       2)在加載類時(shí),每個(gè)類加載器會(huì)將加載任務(wù)上交給其父,如果其父找不到,再由自己去加載。
     
       3)Bootstrap Loader(啟動(dòng)類加載器)是最頂級(jí)的類加載器了,其父加載器為null.
     
       3、類加載器的雙親委派模型
     
       類加載器雙親委派模型的工作過(guò)程是:如果一個(gè)類加載器收到一個(gè)類加載的請(qǐng)求,它首先將這個(gè)請(qǐng)求委派給父類加載器去完成,每一個(gè)層次類加載器都是如此,則所有的類加載請(qǐng)求都會(huì)傳送到頂層的啟動(dòng)類加載器,只有父加載器無(wú)法完成這個(gè)加載請(qǐng)求(即它的搜索范圍中沒(méi)有找到所要的類),子類才嘗試加載。
     
       下面是一個(gè)類加載器雙親委派模型,這里各個(gè)類加載器并不是繼承關(guān)系,它們利用組合實(shí)現(xiàn)的父類與子類關(guān)系。
     
     
       4、類加載的幾種方式
     
       1)命令行啟動(dòng)應(yīng)用時(shí)候由JVM初始化加載,加載含有main的主類。
     
       2)通過(guò)Class.forName()方法動(dòng)態(tài)加載類,默認(rèn)會(huì)執(zhí)行初始化塊。如果指定了ClassLoader,則不會(huì)執(zhí)行初始化塊。
     
       3)通過(guò)ClassLoader.loadClass()方法動(dòng)態(tài)加載類,不會(huì)執(zhí)行初始化塊。
     
       5、類加載實(shí)例
     
       當(dāng)在命令行下執(zhí)行:java HelloWorld(HelloWorld是含有main方法的類的Class文件),JVM會(huì)將HelloWorld.class加載到內(nèi)存中,并在堆中形成一個(gè)Class的對(duì)象HelloWorld.class。
     
       基本的加載流程如下:
     
       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è)為BootstrapLoader。
     
       4)Bootstrap Loader自動(dòng)加載AppClass Loader(系統(tǒng)類加載器),并將其父Loader設(shè)為ExtendedLoader。
     
       5)最后由AppClass Loader加載HelloWorld類。

    posted on 2013-06-22 10:13 好不容易 閱讀(186) 評(píng)論(0)  編輯  收藏


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    PK10開(kāi)獎(jiǎng) PK10開(kāi)獎(jiǎng)
    主站蜘蛛池模板: 亚洲AV一宅男色影视| 亚洲裸男gv网站| 亚洲福利秒拍一区二区| 男人的天堂网免费网站| 亚洲国产精品无码AAA片| 黄页免费在线观看| 亚洲AV无码不卡无码| 最近免费中文字幕大全免费| 亚洲精品无码久久久久久久| 免费能直接在线观看黄的视频| 亚洲成人黄色在线| 扒开双腿猛进入爽爽免费视频| 亚洲国产系列一区二区三区 | 爱爱帝国亚洲一区二区三区| 国产高清免费观看| 无码日韩人妻AV一区免费l | 免费观看国产小粉嫩喷水| 日韩久久无码免费毛片软件| 国产av无码专区亚洲av果冻传媒| 97人妻精品全国免费视频 | 1000部拍拍拍18勿入免费凤凰福利| 亚洲日本国产精华液| 午夜视频免费成人| 无码免费又爽又高潮喷水的视频 | 亚洲综合无码无在线观看| www.亚洲一区| 免费国产成人α片| 日韩亚洲产在线观看| 亚洲精品偷拍视频免费观看| 久久久免费的精品| 一本色道久久88亚洲精品综合| 免费在线黄色网址| 精品一区二区三区无码免费视频| 成人亚洲国产va天堂| 亚洲综合精品网站| 国产成人免费午夜在线观看 | 久久综合亚洲色HEZYO社区| 毛片免费在线观看网址| 国产高清视频免费在线观看| 亚洲欧洲校园自拍都市| heyzo亚洲精品日韩|