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

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

原文:Run-Time Data Areas

Java虛擬機(jī)定義了在程序執(zhí)行期間使用的多個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū)域愕掏。其中一些數(shù)據(jù)區(qū)域是在Java虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建的,只有當(dāng)Java虛擬機(jī)退出時(shí)才會(huì)銷毀分苇。其他數(shù)據(jù)區(qū)域是每個(gè)線程私有的。線程私有的數(shù)據(jù)區(qū)域在線程創(chuàng)建時(shí)創(chuàng)建横侦,在線程退出時(shí)銷毀奕塑。

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

Java虛擬機(jī)可以同時(shí)支持多個(gè)線程執(zhí)行悍引。每個(gè)線程擁有自己的程序計(jì)數(shù)器。在任何時(shí)刻机断,每個(gè)Java虛擬機(jī)線程都在執(zhí)行一個(gè)方法的代碼楷拳,即該線程的當(dāng)前方法。如果該方法不是本地方法(native method),程序計(jì)數(shù)器包含當(dāng)前正在執(zhí)行的Java虛擬機(jī)指令地址。如果線程正在執(zhí)行的是本地方法(native method)酿傍,程序計(jì)數(shù)器的值為空砾莱。Java虛擬機(jī)的程序計(jì)數(shù)器大小足夠在特定平臺(tái)上保存一個(gè)返回地址或本地指針。

Java虛擬機(jī)棧

每個(gè)Java虛擬機(jī)線程都有一個(gè)私有的Java虛擬機(jī)棧饲漾,與線程同時(shí)創(chuàng)建。Java虛擬機(jī)棧里面存儲(chǔ)棧幀。方法從調(diào)用直至執(zhí)行完成的過程坤按,對(duì)應(yīng)著棧幀在虛擬機(jī)棧中從入棧到出棧的過程。因?yàn)槌藥娜霔:统鰲B琂ava虛擬機(jī)棧從來不會(huì)被直接操作臭脓,所以幀可以是堆分配的。Java虛擬機(jī)棧的內(nèi)存不需要是連續(xù)的腹忽。

每個(gè)方法在執(zhí)行時(shí)會(huì)創(chuàng)建一個(gè)棧幀来累,用于存儲(chǔ)局部變量表、操作數(shù)棧窘奏、動(dòng)態(tài)鏈接嘹锁、方法出口等信息。局部變量表中存放了編譯期可知的基本數(shù)據(jù)類型和對(duì)象引用着裹。局部變量表所需的內(nèi)存空間大小在編譯期確定兼耀,運(yùn)行時(shí)不會(huì)改變。

Java虛擬機(jī)規(guī)范允許Java虛擬機(jī)棧是固定大小的求冷,也可以根據(jù)計(jì)算需要?jiǎng)討B(tài)擴(kuò)展和收縮瘤运。如果Java虛擬機(jī)棧是固定大小的,那么創(chuàng)建時(shí)應(yīng)該可以獨(dú)立地選擇每個(gè)Java虛擬機(jī)棧的大小匠题。

下列異常情況與Java虛擬機(jī)棧有關(guān):

  • 如果一個(gè)線程計(jì)算需要的Java虛擬機(jī)棧大小超過了允許的大小拯坟,Java虛擬機(jī)將拋出StackOverflowError
  • 如果Java虛擬機(jī)椌律剑可以動(dòng)態(tài)擴(kuò)展郁季,但是嘗試擴(kuò)展時(shí)內(nèi)存不足冷溃,或者新建線程的時(shí)候沒有足夠的內(nèi)存來創(chuàng)建Java虛擬機(jī)棧,Java虛擬機(jī)將拋出OutOfMemoryError梦裂。

Java虛擬機(jī)有一個(gè)堆似枕,它在所有Java虛擬機(jī)線程之間共享。堆是運(yùn)行時(shí)數(shù)據(jù)區(qū)域年柠,所有類實(shí)例和數(shù)組的內(nèi)存都從堆中分配凿歼。

堆在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建。對(duì)象的堆存儲(chǔ)由一個(gè)自動(dòng)存儲(chǔ)管理系統(tǒng)(稱為垃圾回收器)回收冗恨;對(duì)象從來不會(huì)顯式地釋放答憔。Java虛擬機(jī)沒有特定類型的自動(dòng)存儲(chǔ)管理系統(tǒng),可以根據(jù)實(shí)現(xiàn)者的系統(tǒng)需求選擇存儲(chǔ)管理技術(shù)掀抹。堆可以是固定大小的虐拓,也可以根據(jù)計(jì)算需要擴(kuò)展,如果不需要更大的堆傲武,則可以收縮蓉驹。堆的內(nèi)存不需要是連續(xù)的。

從內(nèi)存回收的角度看揪利,由于垃圾回收器基本都采用分代回收算法态兴,所以Java堆還可以細(xì)分為:新生代和老年代;再細(xì)致一點(diǎn)的有Eden空間土童、From Survivor空間诗茎、To Survivor空間等。從內(nèi)存分配的角度看献汗,線程共享的Java堆中可能劃分出多個(gè)線程私有的分配緩沖區(qū)(Thread Local Allocation Buffer敢订,TLAB)。

下列異常情況與堆有關(guān):

  • 如果計(jì)算時(shí)需要比自動(dòng)存儲(chǔ)管理系統(tǒng)可以提供的更多的堆內(nèi)存罢吃,Java虛擬機(jī)將拋出OutOfMemoryError楚午。

NIO中可以使用Native函數(shù)庫直接分配堆外內(nèi)存,然后通過一個(gè)存儲(chǔ)在Java堆中DirectByteBuffer對(duì)象作為這塊內(nèi)存的引用進(jìn)行操作尿招。這樣可以在一些場景中提高性能矾柜,因?yàn)楸苊饬嗽贘ava堆和Native堆中來回復(fù)制數(shù)據(jù)。雖然直接內(nèi)存的分配不會(huì)受到Java堆大小的限制就谜,但是肯定會(huì)受到本機(jī)總內(nèi)存的限制怪蔑。因此也可能拋出OutOfMemoryError

方法區(qū)

Java虛擬機(jī)有一個(gè)方法區(qū)丧荐,該方法區(qū)在所有Java虛擬機(jī)線程之間共享缆瓣。方法區(qū)類似于傳統(tǒng)語言編譯代碼的存儲(chǔ)區(qū)域,或類似于操作系統(tǒng)進(jìn)程中的“文本”段虹统。它存儲(chǔ)每個(gè)類的結(jié)構(gòu)弓坞,比如運(yùn)行時(shí)常量池隧甚、字段和方法數(shù)據(jù),以及方法和構(gòu)造函數(shù)的代碼渡冻,包括在類和接口初始化以及實(shí)例初始化中使用的特殊方法戚扳。

方法區(qū)在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建。盡管方法區(qū)在邏輯上是堆的一部分族吻,但是簡單的實(shí)現(xiàn)可能選擇不進(jìn)行垃圾收集或壓縮帽借。Java虛擬機(jī)規(guī)范不強(qiáng)制要求方法區(qū)的位置或用于管理編譯代碼的策略。方法區(qū)可以是固定大小的呼奢,也可以根據(jù)計(jì)算的需要擴(kuò)展宜雀,如果不需要更大的方法區(qū)切平,則可以收縮握础。方法區(qū)的內(nèi)存不需要是連續(xù)的。

下列異常情況與方法區(qū)有關(guān):

  • 如果方法區(qū)中的內(nèi)存不能滿足一個(gè)分配請(qǐng)求悴品,Java虛擬機(jī)將拋出OutOfMemoryError禀综。

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

一個(gè)運(yùn)行時(shí)常量池是一個(gè)類或接口在class文件中的constant_pool表的運(yùn)行時(shí)表現(xiàn)。它包含幾種常量苔严,從編譯時(shí)已知的數(shù)值常量到必須在運(yùn)行時(shí)解析的方法和字段引用定枷。運(yùn)行時(shí)常量池的功能類似于傳統(tǒng)編程語言的符號(hào)表,盡管它包含的數(shù)據(jù)范圍比典型的符號(hào)表更廣届氢。

每個(gè)運(yùn)行時(shí)常量池都從Java虛擬機(jī)的方法區(qū)分配欠窒。類或接口的運(yùn)行時(shí)常量池是在Java虛擬機(jī)創(chuàng)建類或接口時(shí)構(gòu)造的。

以下異常情況與類或接口的運(yùn)行時(shí)常量池的構(gòu)造有關(guān):

  • 當(dāng)創(chuàng)建一個(gè)類或接口時(shí)退子,如果構(gòu)造運(yùn)行時(shí)常量池需要的內(nèi)存超過了Java虛擬機(jī)方法區(qū)的可用內(nèi)存岖妄,Java虛擬機(jī)將拋出OutOfMemoryError

本地方法棧

Java虛擬機(jī)實(shí)現(xiàn)可以使用傳統(tǒng)棧寂祥,俗稱"C"棧荐虐,來支持本地方法。Java虛擬機(jī)指令集的解釋器實(shí)現(xiàn)也可以使用本地方法棧丸凭。不能加載本地方法且本身不依賴于傳統(tǒng)棧的Java虛擬機(jī)實(shí)現(xiàn)可以不提供本地方法棧福扬。如果提供了本地方法棧,通常在創(chuàng)建線程時(shí)為每個(gè)線程分配本地方法棧惜犀。

Java虛擬機(jī)規(guī)范允許本地方法棧是固定大小的铛碑,也可以根據(jù)計(jì)算需要?jiǎng)討B(tài)擴(kuò)展或收縮。如果本地方法棧是固定大小的虽界,每個(gè)本地方法棧的大小應(yīng)該在創(chuàng)建時(shí)可以獨(dú)立選擇汽烦。

下列異常情況與本地方法棧有關(guān):

  • 如果線程計(jì)算需要的本地方法棧大小超過了允許的大小,Java虛擬機(jī)將拋出StackOverflowError浓恳。
  • 如果本地方法椛卜欤可以動(dòng)態(tài)擴(kuò)展碗暗,但是嘗試擴(kuò)展本地方法棧時(shí)內(nèi)存不足,或者新建線程的時(shí)候沒有足夠的內(nèi)存來創(chuàng)建本地方法棧梢夯,Java虛擬機(jī)將拋出OutOfMemoryError言疗。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市颂砸,隨后出現(xiàn)的幾起案子噪奄,更是在濱河造成了極大的恐慌,老刑警劉巖人乓,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勤篮,死亡現(xiàn)場離奇詭異,居然都是意外死亡色罚,警方通過查閱死者的電腦和手機(jī)碰缔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來戳护,“玉大人金抡,你說我怎么就攤上這事‰缜遥” “怎么了梗肝?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長铺董。 經(jīng)常有香客問我巫击,道長,這世上最難降的妖魔是什么精续? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任坝锰,我火速辦了婚禮,結(jié)果婚禮上驻右,老公的妹妹穿的比我還像新娘什黑。我一直安慰自己,他們只是感情好堪夭,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布愕把。 她就那樣靜靜地躺著,像睡著了一般森爽。 火紅的嫁衣襯著肌膚如雪恨豁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天爬迟,我揣著相機(jī)與錄音橘蜜,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛计福,可吹牛的內(nèi)容都是我干的跌捆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼象颖,長吁一口氣:“原來是場噩夢啊……” “哼佩厚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起说订,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤抄瓦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后陶冷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钙姊,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年埂伦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了煞额。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赤屋,死狀恐怖立镶,靈堂內(nèi)的尸體忽然破棺而出壁袄,到底是詐尸還是另有隱情类早,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布嗜逻,位于F島的核電站涩僻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏栈顷。R本人自食惡果不足惜逆日,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望萄凤。 院中可真熱鬧室抽,春花似錦、人聲如沸靡努。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惑朦。三九已至兽泄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間漾月,已是汗流浹背病梢。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留梁肿,地道東北人蜓陌。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓觅彰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親钮热。 傳聞我的和親對(duì)象是個(gè)殘疾皇子缔莲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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