JVM內(nèi)存模型【翻譯】

當(dāng)你運(yùn)行一個(gè)Java程序的時(shí)候怯疤,需要開辟一定的空間存放代碼執(zhí)行所需要的數(shù)據(jù),
通常稱之為JVM內(nèi)存催束。
雖然如果你只是單純的寫程序集峦,了解JVM內(nèi)存的細(xì)節(jié)沒(méi)有太大的必要,
但隨著你越深入的了解Java的內(nèi)在機(jī)制,比如做一些性能優(yōu)化的時(shí)候塔淤,
你會(huì)越來(lái)越發(fā)現(xiàn)了解JVM內(nèi)存的重要性摘昌。
當(dāng)你對(duì)JVM內(nèi)存有了足夠的了解的時(shí)候,
你在應(yīng)付內(nèi)存管理高蜂,性能優(yōu)化時(shí)就能更加從容自若聪黎,
作為一個(gè)程序員所必要有的好奇心來(lái)說(shuō),
理解JVM是如何分配內(nèi)存备恤,以及垃圾回收器(GC)是如何工作的本身也是一個(gè)愉快的過(guò)程稿饰。

JVM內(nèi)存模型

執(zhí)行一個(gè)程序的過(guò)程中,JVM會(huì)將JVM內(nèi)存分成幾個(gè)部分露泊。
有些內(nèi)存塊會(huì)隨著JVM的啟動(dòng)而被分配并隨著JVM的退出而消亡喉镰,
有些則是線程級(jí)的數(shù)據(jù)塊。
也就是說(shuō)隨著線程的生命周期共存惭笑。

下面是一個(gè)基本的JVM內(nèi)存結(jié)構(gòu)侣姆。

JVM內(nèi)存模型

下面簡(jiǎn)單的說(shuō)一下這幾個(gè)部分吧。

堆區(qū)

堆區(qū)隨著JVM的啟動(dòng)而被分配沉噩,主要負(fù)責(zé)存儲(chǔ)生成的class實(shí)例和數(shù)組捺宗。

堆的大小可以是固定的,或者是動(dòng)態(tài)調(diào)整的(基于系統(tǒng)配置)川蒙,
并且分配到堆上的數(shù)據(jù)并不需要是連續(xù)的偿凭。

JVM允許開發(fā)者或者用戶配置堆區(qū)的初始化大小,堆是否允許動(dòng)態(tài)的伸縮派歌,以及堆的最大最小值等等。

如果需要分配內(nèi)存但是堆已經(jīng)占滿的情況下痰哨,會(huì)拋出一個(gè)OurOfMeoryError胶果。

方法區(qū)和運(yùn)行時(shí)常量池

方法區(qū)主要用來(lái)存放每個(gè)class的結(jié)構(gòu),
例如:運(yùn)行時(shí)常量斤斧,字段和方法早抠,方法和構(gòu)造函數(shù)的代碼等。

方法區(qū)也是在JVM啟動(dòng)時(shí)被創(chuàng)建撬讽。
盡管從邏輯上來(lái)說(shuō)它是堆區(qū)的一部分但是不能被GC給回收蕊连,
相反對(duì)于堆的垃圾回收卻是強(qiáng)制的。
方法區(qū)可以是一個(gè)固定的大小游昼,也可以根據(jù)需要擴(kuò)張或者壓縮甘苍。
方法區(qū)上的內(nèi)存分配同樣不必是連續(xù)的。

當(dāng)JVM無(wú)法為方法區(qū)分配更多的內(nèi)存時(shí)烘豌,會(huì)拋出OutOfMemoryError

JVM棧

對(duì)于每一個(gè)線程都有一個(gè)私有的棧载庭。
堆存儲(chǔ)幀。
棧幀用來(lái)存儲(chǔ)數(shù)據(jù),臨時(shí)結(jié)果囚聚,動(dòng)態(tài)鏈接靖榕,返回函數(shù)值,拋出異常等顽铸。

棧維護(hù)了局部變量茁计,臨時(shí)結(jié)果并且在函數(shù)執(zhí)行和返回上起到作用。
除了將棧幀壓入和壓出之外谓松,我們不會(huì)直接操作棧本身星压。
棧幀也是在堆上被分配的(HotSpot VM)。
同樣棧上的內(nèi)存分配也不需要是連續(xù)的毒返。

正是因?yàn)檫@樣的規(guī)定允許了椬饽唬可以是固定或者動(dòng)態(tài)調(diào)整的。
如果我們使用固定大小的棧拧簸,那么對(duì)于每一個(gè)棧在初始化時(shí)所分配的大小都是不一樣的劲绪。

如果棧上的內(nèi)存不夠分配的時(shí)候,JVM會(huì)拋出一個(gè)StackOverflowError

如果JVM椗璩啵可以動(dòng)態(tài)擴(kuò)展贾富,但是當(dāng)棧在初始化或者在動(dòng)態(tài)擴(kuò)展時(shí)所需的內(nèi)存不夠時(shí),
JVM會(huì)拋出一個(gè)OutOfMemoryError

本地方法棧

本地方法棧又叫做C棧牺六。
它支持了本地方法(通常由其他語(yǔ)言寫成)在執(zhí)行時(shí)每個(gè)線程上的內(nèi)存分配颤枪。

基本上邏輯和JVM棧相似。

PC寄存器(程序計(jì)數(shù)器)

每一個(gè)JVM線程都有其獨(dú)立的程序計(jì)數(shù)器淑际。
任何時(shí)候畏纲,每個(gè)JVM線程都在執(zhí)行某個(gè)單獨(dú)的方法,通常叫做當(dāng)前方法春缕。

因?yàn)镴ava程序也包含本地代碼(例如本地庫(kù))盗胀,因此我們需要兩種不同的方式來(lái)處理程序計(jì)數(shù)器。
當(dāng)方法不是本地方法時(shí)锄贼,程序計(jì)數(shù)器將包含當(dāng)前執(zhí)行的JVM指令的地址票灰,
否則標(biāo)記為undefined。

這些就是關(guān)于JVM內(nèi)存模型的一個(gè)簡(jiǎn)單介紹宅荤。

A 參考

https://howtodoinjava.com/java/garbage-collection/jvm-memory-model-structure-and-components/
https://docs.oracle.com/cd/B28359_01/server.111/b31107/asmcon.htm#OSTMG036

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末屑迂,一起剝皮案震驚了整個(gè)濱河市拉庵,隨后出現(xiàn)的幾起案子镰烧,更是在濱河造成了極大的恐慌,老刑警劉巖惑灵,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琼了,死亡現(xiàn)場(chǎng)離奇詭異逻锐,居然都是意外死亡夫晌,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門昧诱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)晓淀,“玉大人,你說(shuō)我怎么就攤上這事盏档⌒钻” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵蜈亩,是天一觀的道長(zhǎng)懦窘。 經(jīng)常有香客問(wèn)我,道長(zhǎng)稚配,這世上最難降的妖魔是什么畅涂? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮道川,結(jié)果婚禮上午衰,老公的妹妹穿的比我還像新娘。我一直安慰自己冒萄,他們只是感情好臊岸,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著尊流,像睡著了一般帅戒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上崖技,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天逻住,我揣著相機(jī)與錄音,去河邊找鬼迎献。 笑死鄙信,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的忿晕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼银受,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼践盼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起宾巍,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤咕幻,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后顶霞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肄程,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锣吼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蓝厌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玄叠。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拓提,靈堂內(nèi)的尸體忽然破棺而出读恃,到底是詐尸還是另有隱情,我是刑警寧澤代态,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布寺惫,位于F島的核電站,受9級(jí)特大地震影響蹦疑,放射性物質(zhì)發(fā)生泄漏西雀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一歉摧、第九天 我趴在偏房一處隱蔽的房頂上張望艇肴。 院中可真熱鬧,春花似錦判莉、人聲如沸豆挽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)帮哈。三九已至,卻和暖如春锰镀,著一層夾襖步出監(jiān)牢的瞬間娘侍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工泳炉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留憾筏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓花鹅,卻偏偏與公主長(zhǎng)得像氧腰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子刨肃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344