JVM體系架構(gòu)

JVM是什么

JVM全稱Java Virtual Machine(Java虛擬機(jī))仲智,是一個虛構(gòu)出來的計(jì)算機(jī)尝丐,它屏蔽了與具體操作系統(tǒng)平臺相關(guān)的信息绰筛,使得Java程序只需生成在Java虛擬機(jī)上運(yùn)行的目標(biāo)代碼(字節(jié)碼娇澎,ByteCode), 就可以在多種平臺上不加修改地運(yùn)行疲恢。這背后其實(shí)就是JVM把字節(jié)碼翻譯成具體平臺上的機(jī)器指令凶朗,從而實(shí)現(xiàn)“一次編寫,到處運(yùn)行(Write Once, Run Anywhere)”显拳。

JVM架構(gòu)圖

JVM-Architecture.png

JVM工作機(jī)制

如上面的架構(gòu)圖所示棚愤,JVM分成四個主要的子系統(tǒng):

  1. 類加載器
  2. 運(yùn)行時數(shù)據(jù)區(qū)
  3. 執(zhí)行引擎
  4. 本地方法調(diào)用

類加載器

Java的動態(tài)類加載功能由類加載器子系統(tǒng)處理。它加載,鏈接宛畦,并在類運(yùn)行時第一次引用類時初始化類文件瘸洛,而不是編譯時。

1.1 加載

通過類加載器實(shí)現(xiàn)類的加載動作次和,絕大部分Java程序都會使用到以下三種系統(tǒng)提供的類加載器:

  1. 啟動類加載器(Bootstrap ClassLoader)
  2. 擴(kuò)展類加載器(Extension ClassLoader)
  3. 應(yīng)用程序類加載器(Application ClassLoader)

上面的類加載器將在加載類文件時遵循委托層次結(jié)構(gòu)算法反肋。

1.2 鏈接

  • 驗(yàn)證 確保Class文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,并且不會危害虛擬機(jī)自身的安全
  • 準(zhǔn)備 正式為類變量分配內(nèi)存并設(shè)置初始值的階段踏施,這些變量所使用的內(nèi)存都將在方法區(qū)中進(jìn)行分配
  • 解析 虛擬機(jī)將常量池內(nèi)的符號引用替換為直接引用的過程

1.3 初始化

這是類加載的最后階段石蔗,為所有的變量分配原始值,并執(zhí)行靜態(tài)代碼塊

運(yùn)行時數(shù)據(jù)區(qū)

Java虛擬機(jī)在運(yùn)行程序的過程中會把它所管理的內(nèi)存劃分為若干個不同的數(shù)據(jù)區(qū)畅形。這些區(qū)域都有各自的用途养距,以及創(chuàng)建和銷毀的時間,有的區(qū)域隨著虛擬機(jī)進(jìn)程的啟動而存在日熬,有的區(qū)域則依賴用戶線程的啟動和結(jié)束而建立和銷毀棍厌。

程序計(jì)數(shù)器

一塊較小的內(nèi)存空間,可以看作是當(dāng)前線程所執(zhí)行的字節(jié)碼行號指示器

Java虛擬機(jī)棧

Java虛擬機(jī)棧描述的是Java方法執(zhí)行的內(nèi)存模型竖席,每個方法在執(zhí)行的同時都會創(chuàng)建一個站幀(Stack Frame)用于存儲局部變量表耘纱、操作數(shù)棧、動態(tài)鏈接怕敬、方法出口等信息揣炕。每個方法從調(diào)用到執(zhí)行完成的過程,就對應(yīng)著一個棧幀在虛擬機(jī)棧中入棧到出棧的過程东跪。

本地方法棧

本地方法棧與虛擬機(jī)棧發(fā)揮的作用類似畸陡,虛擬機(jī)棧為虛擬機(jī)執(zhí)行Java方法(也就是字節(jié)碼)服務(wù)岭埠,而本地方法棧則為虛擬機(jī)使用的Native方法服務(wù)胸遇。

Java堆

Java堆是Java虛擬機(jī)所管理的內(nèi)存中最大的一塊崩掘。Java堆是被所有線程共享的一塊內(nèi)存區(qū)域欢搜,在虛擬機(jī)啟動時創(chuàng)建澜共。此內(nèi)存區(qū)域的唯一目的就是存放對象實(shí)例劝术,幾乎所有的對象實(shí)例都在這里分配內(nèi)存寥枝。

Java堆是垃圾收集器管理的主要區(qū)域井仰,因此很多時候也稱作GC堆恶守。

方法區(qū)

與Java堆一樣第献,是各個線程共享的內(nèi)存區(qū)域,它用于存儲已被虛擬機(jī)加載的類信息兔港、常量庸毫、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)衫樊。

執(zhí)行引擎

執(zhí)行通過類加載器分配給運(yùn)行時數(shù)據(jù)區(qū)的字節(jié)碼飒赃,并將這些字節(jié)碼轉(zhuǎn)換成JVM虛擬機(jī)更容易執(zhí)行的語言利花。主要有三個子組件。

解釋器

負(fù)責(zé)讀取字節(jié)碼并順序的執(zhí)行载佳。缺點(diǎn)是當(dāng)一個方法被多次調(diào)用時炒事,每次都需要新的解釋。

JIT(Just In Time)編譯器

抵消了解釋器執(zhí)行緩慢的缺點(diǎn)蔫慧。JIT編譯器同時編譯字節(jié)碼的重復(fù)部分挠乳,總而減少編譯所需的總時間。從而提高性能藕漱。

  1. 中間代碼生成器 負(fù)責(zé)生成中間代碼
  2. 代碼優(yōu)化器 負(fù)責(zé)優(yōu)化上面生成的中間代碼
  3. 目標(biāo)代碼生成器 負(fù)責(zé)生成機(jī)器代碼或本機(jī)代碼
  4. Profiler 一個特殊組件欲侮,負(fù)責(zé)查找熱點(diǎn),即是否被多次調(diào)用

垃圾收集器

收集和刪除未引用的對象來釋放內(nèi)存肋联⊥叮可以通過調(diào)用觸發(fā)垃圾收集System.gc(),但不保證執(zhí)行橄仍。

本地方法接口

JNI與本地方法庫交互韧涨,并提供執(zhí)行引擎所需的本地庫

本地方法庫

執(zhí)行引擎所需要的本地庫的集合

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市侮繁,隨后出現(xiàn)的幾起案子虑粥,更是在濱河造成了極大的恐慌,老刑警劉巖宪哩,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娩贷,死亡現(xiàn)場離奇詭異,居然都是意外死亡锁孟,警方通過查閱死者的電腦和手機(jī)彬祖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來品抽,“玉大人储笑,你說我怎么就攤上這事≡残簦” “怎么了突倍?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長盆昙。 經(jīng)常有香客問我羽历,道長,這世上最難降的妖魔是什么淡喜? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任窄陡,我火速辦了婚禮,結(jié)果婚禮上拆火,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好们镜,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布币叹。 她就那樣靜靜地躺著,像睡著了一般模狭。 火紅的嫁衣襯著肌膚如雪颈抚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天嚼鹉,我揣著相機(jī)與錄音贩汉,去河邊找鬼。 笑死锚赤,一個胖子當(dāng)著我的面吹牛匹舞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播线脚,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼赐稽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了浑侥?” 一聲冷哼從身側(cè)響起姊舵,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寓落,沒想到半個月后括丁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伶选,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年史飞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片考蕾。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡祸憋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肖卧,到底是詐尸還是另有隱情蚯窥,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布塞帐,位于F島的核電站拦赠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏葵姥。R本人自食惡果不足惜荷鼠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望榔幸。 院中可真熱鬧允乐,春花似錦矮嫉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鳞陨,卻和暖如春昨寞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背厦滤。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工援岩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人掏导。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓享怀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親碘菜。 傳聞我的和親對象是個殘疾皇子凹蜈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

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

  • 這篇文章是我之前翻閱了不少的書籍以及從網(wǎng)絡(luò)上收集的一些資料的整理,因此不免有一些不準(zhǔn)確的地方忍啸,同時不同JDK版本的...
    高廣超閱讀 15,545評論 3 83
  • 內(nèi)存溢出和內(nèi)存泄漏的區(qū)別 內(nèi)存溢出:out of memory仰坦,是指程序在申請內(nèi)存時,沒有足夠的內(nèi)存空間供其使用计雌,...
    Aimerwhy閱讀 730評論 0 1
  • 第二部分 自動內(nèi)存管理機(jī)制 第二章 java內(nèi)存異常與內(nèi)存溢出異常 運(yùn)行數(shù)據(jù)區(qū)域 程序計(jì)數(shù)器:當(dāng)前線程所執(zhí)行的字節(jié)...
    小明oh閱讀 1,130評論 0 2
  • 《深入理解Java虛擬機(jī)》筆記_第一遍 先取看完這本書(JVM)后必須掌握的部分悄晃。 第一部分 走近 Java 從傳...
    xiaogmail閱讀 5,062評論 1 34
  • 像云朵 緩慢爬過河流 白羊溫順的看了一眼 九月 繼續(xù)低頭 啃草 并不準(zhǔn)備 為詩經(jīng)里的佳人讓出 在水一方 ...
    楊昊田閱讀 1,152評論 28 31