JVM虛擬機(jī)詳解

1、 什么是JVM?

  JVM是Java Virtual Machine(Java虛擬機(jī))的縮寫,JVM是一種用于計(jì)算設(shè)備的規(guī)范,它是一個(gè)虛構(gòu)出來(lái)的計(jì)算機(jī),是通過(guò)在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來(lái)實(shí)現(xiàn)的。Java虛擬機(jī)包括一套字節(jié)碼指令集、一組寄存器、一個(gè)棧、一個(gè)垃圾回收堆和一個(gè)存儲(chǔ)方法域。 JVM屏蔽了與具體操作系統(tǒng)平臺(tái)相關(guān)的信息,使Java程序只需生成在Java虛擬機(jī)上運(yùn)行的目標(biāo)代碼(字節(jié)碼),就可以在多種平臺(tái)上不加修改地運(yùn)行。JVM在執(zhí)行字節(jié)碼時(shí),實(shí)際上最終還是把字節(jié)碼解釋成具體平臺(tái)上的機(jī)器指令執(zhí)行。

  Java語(yǔ)言的一個(gè)非常重要的特點(diǎn)就是與平臺(tái)的無(wú)關(guān)性。而使用Java虛擬機(jī)是實(shí)現(xiàn)這一特點(diǎn)的關(guān)鍵。一般的高級(jí)語(yǔ)言如果要在不同的平臺(tái)上運(yùn)行,至少需要編譯成不同的目標(biāo)代碼。而引入Java語(yǔ)言虛擬機(jī)后,Java語(yǔ)言在不同平臺(tái)上運(yùn)行時(shí)不需要重新編譯。Java語(yǔ)言使用Java虛擬機(jī)屏蔽了與具體平臺(tái)相關(guān)的信息,使得Java語(yǔ)言編譯程序只需生成在Java虛擬機(jī)上運(yùn)行的目標(biāo)代碼(字節(jié)碼),就可以在多種平臺(tái)上不加修改地運(yùn)行。Java虛擬機(jī)在執(zhí)行字節(jié)碼時(shí),把字節(jié)碼解釋成具體平臺(tái)上的機(jī)器指令執(zhí)行。這就是Java的能夠“一次編譯,到處運(yùn)行”的原因。

2、JRE/JDK/JVM是什么關(guān)系?

JRE(JavaRuntimeEnvironment,Java運(yùn)行環(huán)境),也就是Java平臺(tái)。所有的Java 程序都要在JRE下才能運(yùn)行。普通用戶只需要運(yùn)行已開(kāi)發(fā)好的java程序,安裝JRE即可。?

JDK(Java Development Kit)是程序開(kāi)發(fā)者用來(lái)來(lái)編譯、調(diào)試java程序用的開(kāi)發(fā)工具包。JDK的工具也是Java程序,也需要JRE才能運(yùn)行。為了保持JDK的獨(dú)立性和完整性,在JDK的安裝過(guò)程中,JRE也是 安裝的一部分。所以,在JDK的安裝目錄下有一個(gè)名為jre的目錄,用于存放JRE文件。?

JVM(JavaVirtualMachine,Java虛擬機(jī))是JRE的一部分。它是一個(gè)虛構(gòu)出來(lái)的計(jì)算機(jī),是通過(guò)在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來(lái)實(shí)現(xiàn)的。JVM有自己完善的硬件架構(gòu),如處理器、堆棧、寄存器等,還具有相應(yīng)的指令系統(tǒng)。Java語(yǔ)言最重要的特點(diǎn)就是跨平臺(tái)運(yùn)行。使用JVM就是為了支持與操作系統(tǒng)無(wú)關(guān),實(shí)現(xiàn)跨平臺(tái)。

3、JVM原理

  Java編譯器只要面向JVM,生成JVM能理解的代碼或字節(jié)碼文件。Java源文件經(jīng)編譯成字節(jié)碼程序,通過(guò)JVM將每一條指令翻譯成不同平臺(tái)機(jī)器碼,通過(guò)特定平臺(tái)運(yùn)行。

我剛整理了一套2018最新的0基礎(chǔ)入門和進(jìn)階教程,無(wú)私分享,加Java學(xué)習(xí)裙 :678-241-563 即可獲取,內(nèi)附:開(kāi)發(fā)工具和安裝包,以及系統(tǒng)學(xué)習(xí)路線圖

4、JVM的體系結(jié)構(gòu)

(1)java棧內(nèi)存,它等價(jià)于C語(yǔ)言中的棧, 棧的內(nèi)存地址是不連續(xù)的, 每個(gè)線程都擁有自己的棧。 棧里面存儲(chǔ)著的是StackFrame,在《JVM Specification》中文版中被譯作java虛擬機(jī)框架,也叫做棧幀。StackFrame包含三類信息:局部變量,執(zhí)行環(huán)境,操作數(shù)棧。局部變量用來(lái)存儲(chǔ)一個(gè)類的方法中所用到的局部變量。執(zhí)行環(huán)境用于保存解析器對(duì)于java字節(jié)碼進(jìn)行解釋過(guò)程中需要的信息,包括:上次調(diào)用的方法、局部變量指針和 操作數(shù)棧的棧頂和棧底指針。操作數(shù)棧用于存儲(chǔ)運(yùn)算所需要的操作數(shù)和結(jié)果。StackFrame在方法被調(diào)用時(shí)創(chuàng)建,在某個(gè)線程中,某個(gè)時(shí)間點(diǎn)上,只有一個(gè) 框架是活躍的,該框架被稱為Current Frame,而框架中的方法被稱為Current Method,其中定義的類為Current Class。局部變量和操作數(shù)棧上的操作總是引用當(dāng)前框架。當(dāng)Stack Frame中方法被執(zhí)行完之后,或者調(diào)用別的StackFrame中的方法時(shí),則當(dāng)前棧變?yōu)榱硗庖粋€(gè)StackFrame。Stack的大小是由兩種類 型,固定和動(dòng)態(tài)的,動(dòng)態(tài)類型的棧可以按照線程的需要分配。 下面兩張圖是關(guān)于棧之間關(guān)系以及棧和非堆內(nèi)存的關(guān)系基本描述:

(2) Java堆是用來(lái)存放對(duì)象信息的,和Stack不同,Stack代表著一種運(yùn)行時(shí)的狀態(tài)。換句話說(shuō),棧是運(yùn)行時(shí)單位,解決程序該如何執(zhí)行的問(wèn)題,而堆是存儲(chǔ)的單位, 解決數(shù)據(jù)存儲(chǔ)的問(wèn)題。Heap是伴隨著JVM的啟動(dòng)而創(chuàng)建,負(fù)責(zé)存儲(chǔ)所有對(duì)象實(shí)例和數(shù)組的。堆的存儲(chǔ)空間和棧一樣是不需要連續(xù)的。

(3)程序計(jì)數(shù)寄存器,程序計(jì)數(shù)器(Program Counter Register)是一塊較小的內(nèi)存空間,它的作用可以看做是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器。在虛擬機(jī)的概念模型里(僅是概念模型,各種虛擬機(jī)可能會(huì)通過(guò)一些更高效的方式去實(shí)現(xiàn)),字節(jié)碼解釋器工作時(shí)就是通過(guò)改變這個(gè)計(jì)數(shù)器的值來(lái)選取下一條需要執(zhí)行的字節(jié)碼指令,分支、循環(huán)、跳轉(zhuǎn)、異常處理、線程恢復(fù)等基礎(chǔ)功能都需要依賴這個(gè)計(jì)數(shù)器來(lái)完成。

  由于Java 虛擬機(jī)的多線程是通過(guò)線程輪流切換并分配處理器執(zhí)行時(shí)間的方式來(lái)實(shí)現(xiàn)的,在任何一個(gè)確定的時(shí)刻,一個(gè)處理器(對(duì)于多核處理器來(lái)說(shuō)是一個(gè)內(nèi)核)只會(huì)執(zhí)行一條線程中的指令。因此,為了線程切換后能恢復(fù)到正確的執(zhí)行位置,每條線程都需要有一個(gè)獨(dú)立的程序計(jì)數(shù)器,各條線程之間的計(jì)數(shù)器互不影響,獨(dú)立存儲(chǔ),我們稱這類內(nèi)存區(qū)域?yàn)椤熬€程私有”的內(nèi)存。如果線程正在執(zhí)行的是一個(gè)Java 方法,這個(gè)計(jì)數(shù)器記錄的是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令的地址;如果正在執(zhí)行的是Natvie 方法,這個(gè)計(jì)數(shù)器值則為空(Undefined)。此內(nèi)存區(qū)域是唯一一個(gè)在Java 虛擬機(jī)規(guī)范中沒(méi)有規(guī)定任何OutOfMemoryError 情況的區(qū)域。

(4)方法區(qū)域(Method Area),在Sun JDK中這塊區(qū)域?qū)?yīng)的為PermanetGeneration,又稱為持久代。方法區(qū)域存放了所加載的類的信息(名稱、修飾符等)、類中的靜態(tài)變量、類中定義為final類型的常量、類中的Field信息、類中的方法信息,當(dāng)開(kāi)發(fā)人員在程序中通過(guò)Class對(duì)象中的getName、isInterface等方法來(lái)獲取信息時(shí),這些數(shù)據(jù)都來(lái)源于方法區(qū)域,同時(shí)方法區(qū)域也是全局共享的,在一定的條件下它也會(huì)被GC,當(dāng)方法區(qū)域需要使用的內(nèi)存超過(guò)其允許的大小時(shí),會(huì)拋出OutOfMemory的錯(cuò)誤信息。

(5)運(yùn)行時(shí)常量池(Runtime Constant Pool),存放的為類中的固定的常量信息、方法和Field的引用信息等,其空間從方法區(qū)域中分配。

(6)本地方法堆棧(Native Method Stacks),JVM采用本地方法堆棧來(lái)支持native方法的執(zhí)行,此區(qū)域用于存儲(chǔ)每個(gè)native方法調(diào)用的狀態(tài)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,196評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 175,688評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 62,654評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,456評(píng)論 6 406
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 54,955評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 42,195評(píng)論 0 287
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,725評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,608評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,802評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,048評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 34,422評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 35,673評(píng)論 1 281
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,424評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,762評(píng)論 2 372

推薦閱讀更多精彩內(nèi)容

  • 1、 什么是JVM? JVM是Java Virtual Machine(Java虛擬機(jī))的縮寫,JVM是一種用于計(jì)...
    程序員技術(shù)圈閱讀 748評(píng)論 0 22
  • 一、 什么是JVM JVM(JavaVirtualMachine,Java虛擬機(jī))是JRE的一部分。它是一個(gè)虛構(gòu)出...
    simler閱讀 277評(píng)論 0 0
  • 今天周六,起的有點(diǎn)晚,起床吃飯后匆匆趕去學(xué)畫畫,中午接到艾哲,告訴我上午畫了一個(gè)啤酒瓶子,我問(wèn)她畫的如何?她說(shuō)老師...
    艾哲麻麻閱讀 103評(píng)論 0 0