国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

JVM加載class文件原理

2019-11-11 02:41:46
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言

學(xué)習(xí)java、Android也有差不多半年時(shí)間了,是時(shí)候記錄一下學(xué)習(xí)過(guò)程中的心得和經(jīng)驗(yàn),這篇文章就是簡(jiǎn)單描述一下JVM加載class文件的機(jī)制。

JVM組成

圖1 JVM組成

Classloader 類加載器,負(fù)責(zé)查找并裝載Class 文件到內(nèi)存,最終形成可以被虛擬機(jī)直接使用的Java類型Class Area 方法區(qū),在類裝載器加載class文件到內(nèi)存的過(guò)程中,虛擬機(jī)會(huì)提取其中的類型信息,并將這些信息存儲(chǔ)到方法區(qū)。方法區(qū)用于存儲(chǔ)已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。Heap 堆,存儲(chǔ)Java程序創(chuàng)建的類實(shí)例。Stack 棧,每當(dāng)啟動(dòng)一個(gè)新線程時(shí),Java虛擬機(jī)都會(huì)為它分配一個(gè)Java棧。Java棧以幀為單位保存線程的運(yùn)行狀態(tài)。虛擬機(jī)只會(huì)直接對(duì)Java棧執(zhí)行兩種操作:以幀為單位的壓棧或出棧。當(dāng)線程調(diào)用java方法時(shí),虛擬機(jī)壓入一個(gè)新的棧幀到該線程的java棧中。當(dāng)方法返回時(shí),這個(gè)棧幀被從java棧中彈出并拋棄。一個(gè)棧幀包含一個(gè)java方法的調(diào)用狀態(tài),它存儲(chǔ)有局部變量表、操作棧、動(dòng)態(tài)鏈接、方法出口等信息。PC Register PC寄存器(程序計(jì)數(shù)器):一個(gè)運(yùn)行中的Java程序,每當(dāng)啟動(dòng)一個(gè)新線程時(shí),都會(huì)為這個(gè)新線程創(chuàng)建一個(gè)自己的PC寄存器(程序計(jì)數(shù)器)。程序計(jì)數(shù)器的作用可以看做是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器。字節(jié)碼解釋器工作時(shí)就是通過(guò)改變這個(gè)計(jì)數(shù)器的值來(lái)選取下一條需要執(zhí)行的字節(jié)碼指令,分支、循環(huán)、跳轉(zhuǎn)、異常處理、線程恢復(fù)等基礎(chǔ)功能都需要依賴這個(gè)計(jì)數(shù)器來(lái)完成。如果線程正在執(zhí)行的是一個(gè)Java方法,這個(gè)計(jì)數(shù)器記錄的是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令的地址;如果正在執(zhí)行的是Natvie方法,這個(gè)計(jì)數(shù)器值則為空(Undefined)。Native Method Stack 本地方法棧,本地方法棧與虛擬機(jī)棧所發(fā)揮的作用是非常相似的,其區(qū)別不過(guò)是虛擬機(jī)棧為虛擬機(jī)執(zhí)行Java方法(也就是字節(jié)碼)服務(wù),而本地方法棧則是為虛擬機(jī)使用到的Native方法服務(wù)。任何本地方法接口都會(huì)使用某種本地方法棧。當(dāng)線程調(diào)用Java方法時(shí),虛擬機(jī)會(huì)創(chuàng)建一個(gè)新的棧幀并壓入Java棧。然而當(dāng)它調(diào)用的是本地方法時(shí),虛擬機(jī)會(huì)保持Java棧不變,不再在線程的Java棧中壓入新的幀,虛擬機(jī)只是簡(jiǎn)單地動(dòng)態(tài)鏈接并直接調(diào)用指定的本地方法。如果某個(gè)虛擬機(jī)實(shí)現(xiàn)的本地方法接口是使用C連接模型的話,那么它的本地方法棧就是C棧。execution engine 執(zhí)行引擎,負(fù)責(zé)執(zhí)行字節(jié)碼。方法的字節(jié)碼是由Java虛擬機(jī)的指令序列構(gòu)成的。每一條指令包含一個(gè)單字節(jié)的操作碼,后面跟隨0個(gè)或多個(gè)操作數(shù)。執(zhí)行引擎執(zhí)行字節(jié)碼時(shí),首先取得一個(gè)操作碼,如果操作碼有操作數(shù),取得它的操作數(shù)。它執(zhí)行操作碼和跟隨的操作數(shù)規(guī)定的動(dòng)作,然后再取得下一個(gè)操作碼。這個(gè)執(zhí)行字節(jié)碼的過(guò)程在線程完成前將一直持續(xù)。Native Method interface 本地方法接口,作用是融合不同的編程語(yǔ)言為Java 所用,它的初衷是融合C/C++ 程序,Java 誕生的時(shí)候是C/C++ 橫行的時(shí)候,要想立足,必須有一個(gè)聰明的、睿智的調(diào)用C/C++ 程序,于是就在內(nèi)存中專門(mén)開(kāi)辟了一塊區(qū)域處理標(biāo)記為native 的代碼,它的具體做法是Native Method Stack 中登記native 方法,在Execution Engine 執(zhí)行時(shí)加載native libraies 。目前該方法使用的是越來(lái)越少了,除非是與硬件有關(guān)的應(yīng)用,比如通過(guò)Java 程序驅(qū)動(dòng)打印機(jī),或者Java 系統(tǒng)管理生產(chǎn)設(shè)備,在企業(yè)級(jí)應(yīng)用中已經(jīng)比較少見(jiàn),因?yàn)楝F(xiàn)在的異構(gòu)領(lǐng)域間的通信很發(fā)達(dá),比如可以使用Socket 通信,也可以使用Web Service 等等,不多做介紹。

Classloader體系結(jié)構(gòu)

Java中的類加載器實(shí)質(zhì)上也是類,功能是把類載入jvm中,值得注意的是jvm的類裝載器并不是一個(gè),而是三個(gè): 1. BootstrapLoader 啟動(dòng)類裝載器 : 每個(gè)Java虛擬機(jī)實(shí)現(xiàn)都必須有一個(gè)啟動(dòng)類裝載器。它只負(fù)責(zé)在系統(tǒng)類(核心Java API的class文件)的安裝路徑中查找要裝入的類。這個(gè)裝載器的實(shí)現(xiàn)由C++ 所撰寫(xiě)而成,是JVM實(shí)現(xiàn)的一部分。 2. ExtClassLoader 擴(kuò)展類裝載器:負(fù)責(zé)除核心Java API以外的其它c(diǎn)lass文件的裝載。例如、用于安裝或下載標(biāo)準(zhǔn)擴(kuò)展的class文件,在類路徑中發(fā)現(xiàn)的類庫(kù)的class文件,用于應(yīng)用程序運(yùn)行的class文件等等。 3. AppClassLoader 用戶自定義類裝載器:負(fù)責(zé)除核心Java API以外的其它c(diǎn)lass文件的裝載。這里有一點(diǎn)需要注意:自定義類裝載器并非由應(yīng)用程序員自己實(shí)現(xiàn),它也是JVM

JVM加載class的過(guò)程

當(dāng)我們使用命令來(lái)執(zhí)行某一個(gè)Java程序(比如Test.class)的時(shí)候:java Test (1) java.exe 會(huì)幫助我們找到 JRE ,接著找到位于 JRE 內(nèi)部的 jvm.dll ,這才是真正的 Java 虛擬機(jī)器 , 最后加載動(dòng)態(tài)庫(kù),激活 Java 虛擬機(jī)器。 (2) 虛擬機(jī)器激活以后,會(huì)先做一些初始化的動(dòng)作,比如說(shuō)讀取系統(tǒng)參數(shù)等。一旦初始化動(dòng)作完成之后,就會(huì)產(chǎn)生第一個(gè)類裝載器 ―― BootstrapLoader(啟動(dòng)類裝載器 ) 。 (3) Bootstrap Loader 所做的初始工作中,除了一些基本的初始化動(dòng)作之外,最重要的就是加載 Launcher.java 之中的 ExtClassLoader(擴(kuò)展類裝載器) ,并設(shè)定其 Parent 為 null ,代表其父加載器為 BootstrapLoader 。 (4) 然后 Bootstrap Loader 再要求加載 Launcher.java 之中的 AppClassLoader(用戶自定義類裝載器 ) ,并設(shè)定其 Parent 為之前產(chǎn)生的 ExtClassLoader 實(shí)體。這兩個(gè)加載器都是以靜態(tài)類的形式存在的。這里要注意的是, LauncherExtClassLoader.class與LauncherAppClassLoader.class 都是由 Bootstrap Loader 所加載,所以 Parent 和由哪個(gè)類加載器加載沒(méi)有關(guān)系。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 汉阴县| 温泉县| 石楼县| 时尚| 丹东市| 黑河市| 五常市| 重庆市| 榆林市| 兴山县| 云龙县| 金湖县| 海南省| 岳池县| 郴州市| 台中市| 鸡泽县| 高雄县| 新泰市| 中阳县| 育儿| 沙洋县| 西宁市| 阿鲁科尔沁旗| 花莲市| 平谷区| 闵行区| 博白县| 萨迦县| 方山县| 苏尼特右旗| 永定县| 托克托县| 无为县| 政和县| 滦南县| 汝州市| 通道| 武山县| 内乡县| 万载县|