LetsCoding.cn

          天地之間有桿秤,拿秤砣砸老百姓。

          短小精悍的虛擬機(jī):JVM基本結(jié)構(gòu)和功能介紹

          歡迎來到“Under The Hood”第一期。本期,我將給出JVM的基本結(jié)構(gòu)和功能介紹。

          什么是JVM?為什么要有它?

          JVM(Java虛擬機(jī))是一個(gè)運(yùn)行已編譯Java程序的抽象計(jì)算機(jī)。之所以說是”虛擬“的,是因?yàn)樗?#8220;真正”的硬件平臺(tái)和操作系統(tǒng),一般以軟件的形式實(shí)現(xiàn)。所有的Java程序都為JVM而編譯。因此,在特定平臺(tái)上運(yùn)行已編譯Java程序之前,該平臺(tái)的JVM必須先要被實(shí)現(xiàn)。

          JVM在Java的跨平臺(tái)特性中,起著中間人的角色。它在已編譯Java程序與底層硬件平臺(tái)和操作系統(tǒng)之間,提供一個(gè)抽象層。JVM對(duì)Java的可移植性非常關(guān)鍵,因?yàn)椋丫幾gJava程序運(yùn)行在JVM之上,并獨(dú)立于底層JVM的具體實(shí)現(xiàn)。

          那么,是什么導(dǎo)致JVM的短小精悍?當(dāng)被實(shí)現(xiàn)成軟件時(shí),JMV很小巧。它被設(shè)計(jì)成這樣,是為了讓它能夠適用于盡可能多的地方,比如機(jī)頂盒,手機(jī)和個(gè)人電腦。JVM很精悍,是因?yàn)樗囊靶摹?#8221;無處不在!“是它的戰(zhàn)斗口號(hào)。它想要無處不在,并且Java程序”一次編寫,到處運(yùn)行“的程度說明了它的成功。

          Java字節(jié)碼

          Java程序被編譯成一種叫做字節(jié)碼的東東。JVM執(zhí)行Java字節(jié)碼,所以字節(jié)碼可以被認(rèn)為是JVM的機(jī)器語言。Java編譯器讀取Java源文件,把它翻譯成Java字節(jié)碼并保存到類文件(.class文件)中。編譯器會(huì)為源碼中的每一個(gè)類生成一個(gè)類文件。

          對(duì)JVM來說,字節(jié)碼流就是指令序列。每條指令包含一個(gè)單字節(jié)的操作碼和零個(gè)或多個(gè)操作數(shù)。操作碼告訴JVM要執(zhí)行的操作。如果JVM需要除操作碼之外更多的信息去執(zhí)行一項(xiàng)操作,那么,需要的信息作為操作數(shù),緊跟在操作碼之后。

          每個(gè)字節(jié)碼都有一個(gè)助記符,它可被當(dāng)作JVM的匯編語言。例如,有個(gè)指令會(huì)讓JVM把0壓到堆棧中。該指令的助記符是iconst_0,字節(jié)碼值是0×60。該指令沒有操作數(shù)。另一個(gè)指令讓程序的執(zhí)行在內(nèi)存中無條件向前向后跳轉(zhuǎn)。這個(gè)指令需要一個(gè)操作數(shù),它是一個(gè)指明從當(dāng)前內(nèi)存地址開始的2字節(jié)無符號(hào)偏移量。通過把偏移量加到當(dāng)前內(nèi)存地址,JVM可以獲得要跳轉(zhuǎn)的目標(biāo)內(nèi)存地址。該指令的助記符是goto,它的字節(jié)碼值是0xa7。

          虛擬部分

          JVM的“虛擬硬件”可以分為四個(gè)部分:寄存器組,棧區(qū),垃圾收集堆和方法區(qū)。這些部分很抽象,就像由它們組成的虛擬機(jī)一樣;但是它們必須在每個(gè)JVM的實(shí)現(xiàn)中,以某種形式存在。

          JVM中地址的是32位(4字節(jié))的,因此,JVM可以處理4GB(2的32次方)的內(nèi)存。棧區(qū),垃圾收集堆和方法區(qū)處在這4GB內(nèi)存中的某個(gè)地方,至于它們的具體內(nèi)存地址,這取決于每個(gè)特定JVM的實(shí)現(xiàn)者。

          JVM中一個(gè)字(word)的長度是32位的。JVM中有少數(shù)幾個(gè)原始數(shù)據(jù)類型:byte(8位),short(16位),int(32位),long(64位),float(32位),double(64位),char(16位)。除了無符號(hào)Unicode字符char之外,其他6種數(shù)字類型都是有符號(hào)的。這些類型可以方便的映射到Java程序員可用的數(shù)據(jù)類型。另一個(gè)原始類型是對(duì)象句柄,它是一個(gè)指向堆中對(duì)象的32位地址。

          由于包含字節(jié)碼,方法區(qū)以字節(jié)邊界對(duì)齊。棧和垃圾收集堆以字(32位)邊界對(duì)齊1

          寄存器:我少我自豪

          JVM有1個(gè)程序計(jì)數(shù)器(counter)和3個(gè)管理?xiàng)5募拇嫫鳎╮egister)。它只有很少的寄存器,是因?yàn)镴VM字節(jié)碼指令主要操作棧區(qū)。這種面向棧的設(shè)計(jì),使得JVM指令集和JVM實(shí)現(xiàn)很小巧。

          JVM使用程序計(jì)數(shù)器(也叫pc寄存器),跟蹤當(dāng)前執(zhí)行指令的內(nèi)存位置。另外3個(gè)寄存器(optop寄存器,frame寄存器和vars寄存器)指向當(dāng)前執(zhí)行方法棧幀上不同的部位。執(zhí)行方法的棧幀持有特定方法調(diào)用的狀態(tài)(本地變量,即時(shí)計(jì)算結(jié)果等)。

          方法區(qū)和程序計(jì)數(shù)器

          方法區(qū)是字節(jié)碼呆的地方。程序計(jì)數(shù)器跟蹤執(zhí)行線程。當(dāng)前字節(jié)碼指令執(zhí)行后,程序計(jì)數(shù)器會(huì)包含下一條執(zhí)行指令的地址:一條指令執(zhí)行之后,JVM把程序計(jì)數(shù)器設(shè)置為緊跟上一條指令的指令地址,除非上一條指令具體指明一次跳轉(zhuǎn)。

          Java棧和相關(guān)寄存器

          Java棧用來保存字節(jié)碼指令的參數(shù)和執(zhí)行結(jié)果,給方法傳遞參數(shù)和返回結(jié)果,保存每個(gè)方法調(diào)用的狀態(tài)。方法調(diào)用的狀態(tài)被稱為調(diào)用棧幀。var寄存器,frame寄存器和optop寄存器指向當(dāng)前棧幀的不同部位。

          Java棧幀有3個(gè)區(qū):本地變量,執(zhí)行環(huán)境和操作數(shù)棧。本地變量區(qū),包含當(dāng)前方法調(diào)用中使用的所有本地變量。它由vars寄存器指向。執(zhí)行環(huán)境區(qū)用來維護(hù)棧區(qū)本身的操作。它被frame寄存器指向。操作數(shù)區(qū)用來作為字碼指令的工作區(qū)。正是在這里,存放著字節(jié)碼指令的參數(shù)和其返回結(jié)果。操作數(shù)棧區(qū)的頂部被optop寄存器指向。

          執(zhí)行環(huán)境通常夾在本地變量和操作數(shù)棧中間。當(dāng)前執(zhí)行方法的操作數(shù)棧總是在棧區(qū)的最上面,所以optop寄存器總是指向整個(gè)Java棧的頂部。

          垃圾收集堆

          堆是Java對(duì)象生存的地方。任何時(shí)候,你用new操作符分配的內(nèi)存,都來自堆中。Java語言不允許你直接釋放分配的內(nèi)存。運(yùn)行時(shí)環(huán)境會(huì)跟蹤堆上每個(gè)對(duì)象的引用,自動(dòng)釋放那些不被引用的對(duì)象所占據(jù)的內(nèi)存,這個(gè)過程被稱為垃圾收集。

          參考

          1. 關(guān)于內(nèi)存對(duì)齊方式,請(qǐng)參考Data alignment: Straighten up and fly right

          本文譯自:The lean, mean, virtual machine

          原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明: 轉(zhuǎn)載自LetsCoding.cn
          本文鏈接地址: 短小精悍的虛擬機(jī):JVM基本結(jié)構(gòu)和功能介紹

          posted on 2014-05-17 21:50 Rolandz 閱讀(1619) 評(píng)論(0)  編輯  收藏 所屬分類: 編程實(shí)踐

          導(dǎo)航

          統(tǒng)計(jì)

          留言簿(1)

          隨筆分類(12)

          隨筆檔案(19)

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 棋牌| 二手房| 尼玛县| 乐山市| 吴桥县| 尖扎县| 兖州市| 肥乡县| 新昌县| 平昌县| 托克逊县| 凤城市| 深圳市| 新竹市| 武乡县| 崇文区| 梨树县| 永年县| 宜良县| 龙州县| 上犹县| 建昌县| 石泉县| 河南省| 克什克腾旗| 西青区| 修文县| 永丰县| 洱源县| 明光市| 论坛| 安义县| 元阳县| 三河市| 衢州市| 揭东县| 三台县| 平山县| 高平市| 视频| 皮山县|