深入理解Java虛擬機(jī)(一)java運(yùn)行時(shí)數(shù)據(jù)區(qū)域

Java語言和虛擬機(jī)規(guī)范官方文檔:https://docs.oracle.com/javase/specs/index.html

概述

Java虛擬機(jī)在執(zhí)行程序的過程中,會(huì)把它管理的內(nèi)存分為不同的數(shù)據(jù)區(qū)域恋追。其中一些數(shù)據(jù)區(qū)域是在Java虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建的隙疚,僅在Java虛擬機(jī)退出時(shí)才被銷毀。有些數(shù)據(jù)區(qū)域是每個(gè)線程私有的搬瑰。在創(chuàng)建線程時(shí)創(chuàng)建每個(gè)線程的數(shù)據(jù)區(qū)域,并在線程退出時(shí)銷毀每個(gè)數(shù)據(jù)區(qū)域。如圖所示:


image.png

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

程序計(jì)數(shù)器可以看作當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器哪痰。

  • 每個(gè)線程都需要一個(gè)獨(dú)立的程序計(jì)數(shù)器,各個(gè)線程之間的計(jì)數(shù)器互不影響?yīng)毩⒋鎯?chǔ)久妆,可以說這類內(nèi)存區(qū)域是線程私有的晌杰。

  • 如果線程正在執(zhí)行的是Java方法,那么這個(gè)計(jì)數(shù)器記錄的是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令的地址筷弦。

  • 如果線程正在執(zhí)行的是Native方法肋演,那么這個(gè)計(jì)數(shù)器的值是Undefined。

  • 此內(nèi)存區(qū)域是唯一一個(gè)在Java虛擬機(jī)規(guī)范中沒有規(guī)定任何OutofMemoryError情況的區(qū)域奸笤。

Java虛擬機(jī)棧

Java虛擬機(jī)棧也是線程私有的惋啃,它是為虛擬機(jī)執(zhí)行Java方法(也就是字節(jié)碼)服務(wù)。

  • 每個(gè)方法在執(zhí)行的同時(shí)都會(huì)創(chuàng)建一個(gè)棧幀(Stack Frame)用于存儲(chǔ)局部變量表监右、操作數(shù)棧边灭、動(dòng)態(tài)鏈接、方法出口等信息健盒。

  • 每個(gè)方法從調(diào)用到執(zhí)行完成過程中绒瘦,就對(duì)應(yīng)著一個(gè)棧幀在虛擬機(jī)棧中入棧到出棧的過程称簿。

  • 局部變量表存放了編譯期可知的8種數(shù)據(jù)類型、對(duì)象引用和returnAddress類型(指向了一條字節(jié)碼指令地址)惰帽。

  • 如果線程請(qǐng)求的棧深度大于虛擬機(jī)所允許的深度憨降,將拋出StackOverflowError異常。

  • 如果虛擬機(jī)椄眯铮可以動(dòng)態(tài)擴(kuò)展授药,擴(kuò)展時(shí)無法申請(qǐng)到足夠的內(nèi)存,就會(huì)拋出OutOfMemoryError異常呜魄。

本地方法棧

本地方法棧是為虛擬機(jī)適用到的Native方法服務(wù)的悔叽。有的虛擬機(jī)(譬如sun HotSpot)直接就把本地方法棧和虛擬機(jī)棧合二為一。它拋出的異常與虛擬機(jī)棧類似爵嗅。

Java堆

對(duì)大多數(shù)應(yīng)用來說娇澎,Java堆是虛擬機(jī)管理的內(nèi)存中最大的一塊區(qū)域,是被所有線程共享的區(qū)域睹晒。官方文檔中寫道


The heap is the run-time data area from which memory for all class instances and arrays is allocated.

即所有的對(duì)象實(shí)例和數(shù)組都要在堆上分配趟庄。但隨著JIT編譯器發(fā)展,這并非絕對(duì)的伪很。

  • Java堆書垃圾回收的主要區(qū)域戚啥。它還可以細(xì)分為:新生代和老年代;再細(xì)致一點(diǎn)有Eden空間是掰、From Survivor空間虑鼎、To Survivor空間。

  • 如果在堆中沒有內(nèi)存可用键痛,且堆無法再擴(kuò)展時(shí)炫彩,就會(huì)拋出OutOfMemoryError異常。

方法區(qū)

方法區(qū)也是各個(gè)線程共享的內(nèi)存區(qū)域絮短,用于存儲(chǔ)虛擬機(jī)加載的類信息江兢、常量、靜態(tài)變量丁频、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)杉允。

官方文檔中只規(guī)定了方法區(qū)這個(gè)概念,但沒有規(guī)定具體的實(shí)現(xiàn)方式席里。在JDK1.7以前叔磷,HotSpot虛擬機(jī)主要使用永久代的方式來實(shí)現(xiàn)方法區(qū),JDK1.8開始改為元空間奖磁。

運(yùn)行時(shí)常量池

運(yùn)行時(shí)常量池是方法區(qū)的一部分改基。Class文件中除了有類的版本、字段咖为、方法秕狰、接口等描述信息外稠腊,還有一項(xiàng)就是常量池,用于存放編譯期生成的各種字面量和符號(hào)引用鸣哀,這部分內(nèi)容在類加載后進(jìn)入方法區(qū)的運(yùn)行時(shí)常量池存放架忌。

運(yùn)行時(shí)常量池相比于Class文件常量池,具備動(dòng)態(tài)性我衬。Java并不要求常量一定只有編譯期才能產(chǎn)生叹放,運(yùn)行期間也可能有新的常量放入池中。例如String類的intern()方法挠羔。

關(guān)于String類的intern方法许昨,推薦一篇文章:https://tech.meituan.com/2014/03/06/in-depth-understanding-string-intern.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市褥赊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌莉恼,老刑警劉巖拌喉,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異俐银,居然都是意外死亡尿背,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門捶惜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來田藐,“玉大人,你說我怎么就攤上這事吱七∑茫” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵踊餐,是天一觀的道長景醇。 經(jīng)常有香客問我,道長吝岭,這世上最難降的妖魔是什么三痰? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮窜管,結(jié)果婚禮上散劫,老公的妹妹穿的比我還像新娘。我一直安慰自己幕帆,他們只是感情好获搏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蜓肆,像睡著了一般颜凯。 火紅的嫁衣襯著肌膚如雪谋币。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天症概,我揣著相機(jī)與錄音蕾额,去河邊找鬼。 笑死彼城,一個(gè)胖子當(dāng)著我的面吹牛诅蝶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播募壕,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼调炬,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了舱馅?” 一聲冷哼從身側(cè)響起缰泡,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎代嗤,沒想到半個(gè)月后棘钞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡干毅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年宜猜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片硝逢。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡姨拥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出渠鸽,到底是詐尸還是另有隱情叫乌,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布拱绑,位于F島的核電站综芥,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏猎拨。R本人自食惡果不足惜膀藐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望红省。 院中可真熱鬧额各,春花似錦、人聲如沸吧恃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至傲醉,卻和暖如春蝇闭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背硬毕。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國打工呻引, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吐咳。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓逻悠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親韭脊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子童谒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355