JVM的結(jié)構(gòu)介紹

一式撼、前言

為什么要學習了解Java虛擬機

1.我們需要更加清楚的了解Java底層是如何運作的终抽,有利于我們更深刻的學習好Java纪他。
  2.對我們調(diào)試錯誤提供很寶貴的經(jīng)驗。
  3.這是合格的Java程序必須要了解的內(nèi)容耻煤。

二具壮、Java虛擬機的定義

Java虛擬機(Java Virtual Machine)准颓,簡稱JVM。當我們說起Java虛擬機時棺妓,可能指的是如下三種不同的東西:

1.抽象規(guī)范瞬场。
2.一個具體的實現(xiàn)。
3.一個運行中的虛擬機實例涧郊。

Java虛擬機抽象規(guī)范僅僅是一個概念,在《The Java Virtual Machine Specification》(java虛擬機規(guī)范)中有詳細的描述眼五。該規(guī)范的實現(xiàn)妆艘,可能來自多個提供商,并存在于多個平臺上看幼,它或者是全部由軟件實現(xiàn)批旺,或者是以硬件和軟件相結(jié)合的方式來實現(xiàn)。當運行一個Java程序的時候诵姜,也就在運行一個Java虛擬機實例汽煮。注意,我們所說的Java平臺無關(guān)性是指class文件的平臺無關(guān)性棚唆,JVM是和平臺相關(guān)的暇赤,不同操作系統(tǒng)對應(yīng)不同的JVM。

三宵凌、Java虛擬機的總體框架圖

下圖是整個Java虛擬機的總體框架圖鞋囊,之后我們會經(jīng)常涉及到。

四瞎惫、Java虛擬機的體系結(jié)構(gòu)

下圖表示了Java虛擬機的結(jié)構(gòu)框圖溜腐,主要描述了JVM子系統(tǒng)和內(nèi)存區(qū)。

五瓜喇、Java虛擬機各組成部分

5.1 類裝載子系統(tǒng)

類裝載子系統(tǒng)負責查找并裝載類型挺益,Java虛擬機由兩種類裝載器:啟動類裝載器(Java虛擬機實現(xiàn)的一部分)和用戶自定義類裝載器(Java程序的一部分)。類裝載子系統(tǒng)負責定位和導(dǎo)入二進制class文件乘寒,并且保證導(dǎo)入類的正確性望众,為類變量分配并初始化內(nèi)存,以及幫助解析符號引用肃续。類裝載器必須嚴格按照如下順序進行類的裝載黍檩。

1) 裝載 -- 查找并裝載類型的二進制數(shù)據(jù)
2) 連接 -- 執(zhí)行驗證,準備始锚,以及解析(可選)刽酱,連接分為如下三個步驟

驗證 -- 確保被導(dǎo)入類型的正確性
    準備 -- 為類變量分配內(nèi)存,并將其初始化為默認值
    解析 -- 把類型中的符號引用轉(zhuǎn)換為直接引用

3) 初始化 -- 把類變量初始化為正確初始值

啟動類裝載器 -- Java虛擬機必須有一個啟動類裝載器瞧捌,用于裝載受信任的類棵里,如Java API的class文件润文。
  用戶自定義類裝載器 -- 繼承自ClassLoader類,ClassLoader的如下四個方法殿怜,是通往Java虛擬機的通道典蝌。
    1. protected final Class defineClass(String name, byte data[], int offset, int length);
    2. protected final Class defineClass(String name, byte data[], int offset, int length, ProtectionDomain protectionDomain);
    3. protected final Class findSystemClass(String name);
    4. protected final void resolveClass(Class c);
  這四個方法涉及到了裝載和連接兩個階段,defineClass方法data參數(shù)為二進制Java Class文件格式头谜,表示一個新的可用類型骏掀,之后把這個類型導(dǎo)入到方法區(qū)中。findSystemClass的參數(shù)為全限定名柱告,通過類裝載器進行裝載截驮。resolveClass參數(shù)為Class實例,完成連接初始化操作际度。

5.2 方法區(qū)

方法區(qū)是線程共享的內(nèi)存區(qū)域葵袭,用于存儲已被虛擬機加載的類信息、常量乖菱、靜態(tài)變量坡锡、即時編譯器編譯后的代碼等數(shù)據(jù),當方法區(qū)無法滿足內(nèi)存分配需求時窒所,將拋出OutOfMemoryError(內(nèi)存溢出)鹉勒。
  類信息包括

1.類型全限定名。
2.類型的直接超類的全限定名(除非這個類型是java.lang.Object吵取,它沒有超類)贸弥。
3.類型是類類型還是接口類型。
4.類型的訪問修飾符(public海渊、abstract绵疲、final的某個子集)。
5.任何直接超接口的全限定名的有序列表臣疑。
6.類型的常量池盔憨。
7.字段信息。
8.方法信息讯沈。
9.除了常量以外的所有類(靜態(tài))變量郁岩。
10.一個到類ClassLoader的引用。
11.一個到Class類的引用缺狠。

著重介紹常量池 -- 虛擬機必須要為每個被裝載的類型維護一個常量池问慎。常量池就是該類型所用常量的一個有序集合,包括直接常量和對其他類型挤茄、字段和方法的符號引用如叼。它在Java程序的動態(tài)連接中起著核心作用。

5.3 堆

一個虛擬機實例只對應(yīng)一個堆空間穷劈,堆是線程共享的笼恰。堆空間是存放對象實例的地方踊沸,幾乎所有對象實例都在這里分配。堆也是垃圾收集器管理的主要區(qū)域社证。堆可以處于物理上不連續(xù)的內(nèi)存空間中逼龟,只要邏輯上相連就行,當堆中沒有足夠的內(nèi)存進行對象實例分配時,并且堆也無法擴展時追葡,會拋出OutOfMemoryError異常腺律。

5.4 程序計數(shù)器

每個線程擁有自己的程序計數(shù)器,線程之間的程序計數(shù)器互不影響宜肉。PC寄存器的內(nèi)容總是下一條將被執(zhí)行指令的"地址"疾渣,這里的"地址"可以是一個本地指針,也可以是在方法字節(jié)碼中相對于該方法起始指令的偏移量崖飘。如果該線程正在執(zhí)行一個本地方法,則程序計數(shù)器內(nèi)容為undefined杈女,此區(qū)域在Java虛擬機規(guī)范中沒有規(guī)定任何OutOfMemoryError情況的區(qū)域朱浴。

5.5 Java棧

Java棧也是線程私有的,虛擬機只會對棧進行兩種操作茫因,以幀為單位的入棧和出棧喘鸟。每個方法在執(zhí)行時都會創(chuàng)建一個幀芋绸,并入棧,成為當前幀梁沧。棧幀由三部分組成:局部變量區(qū)、操作數(shù)棧蝇裤、幀數(shù)據(jù)區(qū)廷支。
  局部變量區(qū)被組織為一個以字長為單位、從0開始計數(shù)的數(shù)組栓辜。字節(jié)碼指令通過從0開始的索引來使用其中的數(shù)據(jù)恋拍。類型為int、float藕甩、reference和return Address的值在數(shù)組中只占據(jù)一項施敢,而類型為byte、short和char的值存入時都會轉(zhuǎn)化為int類型狭莱,也占一項僵娃,而long、double則連續(xù)占據(jù)兩項腋妙。
  關(guān)于局部變量區(qū)給出如下一個例子默怨。
View Code
  
  可以看到類方法的首項中沒有隱含的this指針,而對象方法則會隱含this指針骤素。并且byte,char,short,boolean類型存入局部變量區(qū)的時候都會被轉(zhuǎn)化成int類型值先壕,當被存回堆或者方法區(qū)時瘩扼,才會轉(zhuǎn)化回原來的類型。
  操作數(shù)棧被組織成一個以字長為單位的數(shù)組垃僚,它是通過標準的棧操作-入棧和出棧來進行訪問集绰,而不是通過索引訪問。入棧和出棧也會存在類型的轉(zhuǎn)化谆棺。
  棧數(shù)據(jù)區(qū)存放一些用于支持常量池解析栽燕、正常方法返回以及異常派發(fā)機制的信息。即將常量池的符號引用轉(zhuǎn)化為直接地址引用改淑、恢復(fù)發(fā)起調(diào)用的方法的幀進行正常返回碍岔,發(fā)生異常時轉(zhuǎn)交異常表進行處理。

5.6 本地方法棧

訪問本地方式時使用到的棧朵夏,為本地方法服務(wù)蔼啦,本地方法區(qū)域也會拋出StackOverflowError(棧溢出)和OutOfMemoryError(內(nèi)存溢出)異常。

5.7 執(zhí)行引擎

用戶所編寫的程序如何表現(xiàn)正確的行為需要執(zhí)行引擎的支持仰猖,執(zhí)行引擎執(zhí)行字節(jié)碼指令捏肢,完成程序的功能。后面會詳細介紹饥侵。

5.8 本地方法接口

本地方法接口稱為JNI鸵赫,是為可移植性準備的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末躏升,一起剝皮案震驚了整個濱河市辩棒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌膨疏,老刑警劉巖一睁,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異佃却,居然都是意外死亡卖局,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門双霍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來砚偶,“玉大人,你說我怎么就攤上這事洒闸∪九鳎” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵丘逸,是天一觀的道長单鹿。 經(jīng)常有香客問我,道長深纲,這世上最難降的妖魔是什么仲锄? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任劲妙,我火速辦了婚禮,結(jié)果婚禮上儒喊,老公的妹妹穿的比我還像新娘镣奋。我一直安慰自己,他們只是感情好怀愧,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布侨颈。 她就那樣靜靜地躺著,像睡著了一般芯义。 火紅的嫁衣襯著肌膚如雪哈垢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天扛拨,我揣著相機與錄音耘分,去河邊找鬼。 笑死绑警,一個胖子當著我的面吹牛求泰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播待秃,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼痹屹!你這毒婦竟也來了章郁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤志衍,失蹤者是張志新(化名)和其女友劉穎暖庄,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體楼肪,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡培廓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了春叫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肩钠。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖暂殖,靈堂內(nèi)的尸體忽然破棺而出价匠,到底是詐尸還是另有隱情,我是刑警寧澤呛每,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布踩窖,位于F島的核電站,受9級特大地震影響晨横,放射性物質(zhì)發(fā)生泄漏洋腮。R本人自食惡果不足惜箫柳,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望啥供。 院中可真熱鬧悯恍,春花似錦、人聲如沸滤灯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鳞骤。三九已至窒百,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間豫尽,已是汗流浹背篙梢。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留美旧,地道東北人渤滞。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像榴嗅,于是被迫代替她去往敵國和親妄呕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

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

  • JAVA虛擬機的生命周期 一個運行時的Java虛擬機實例的天職是:負責運行一個java程序嗽测。當啟動一個Java程序...
    Solang閱讀 1,174評論 0 19
  • JVM內(nèi)存模型Java虛擬機(Java Virtual Machine=JVM)的內(nèi)存空間分為五個部分绪励,分別是: ...
    光劍書架上的書閱讀 2,505評論 2 26
  • 一、 陳光走出塑料布搭的炒飯攤子時唠粥,一連下了好幾天的雨還在下著疏魏,雨滴砸在塑料棚頂上啪嗒啪嗒的聲音像砸在頭皮上。他把...
    春盡閱讀 448評論 2 0
  • 十月秋雨 情 作者:嶼上日光 風飛揚孤葉飄零晤愧, 哪方是浪子歸宿大莫? 秋風蕭蕭云翻卷, 雨落秋涼君何處官份? 絲絲水滴...
    嶼上日光閱讀 262評論 1 1
  • 中秋舅巷,中國一個最最傳統(tǒng)的節(jié)日懈凹,寄托著無數(shù)遠方游子那顆思鄉(xiāng)的心,盡管我已在離家鄉(xiāng)不遠的城市里安家落戶悄谐,有了新的...
    游仔閱讀 233評論 0 0