Java-面試--Java8-JVM內(nèi)存模型

JVM內(nèi)存模型架構(gòu)圖

JVM8內(nèi)存模型.png

JVM8內(nèi)存模型2.png

各個(gè)模塊解讀

1 Program Counter Register (程序計(jì)數(shù)寄存器)

  • 程序計(jì)數(shù)器(Program Counter Register)是一塊較小的內(nèi)存空間,它可以看作是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器段磨。在虛擬機(jī)概念模型里(概念模型,各種虛擬機(jī)可能會(huì)通過(guò)一些更高效的方式實(shí)現(xiàn))逆趣,字節(jié)碼解釋器工作時(shí)就是通過(guò)改變這個(gè)計(jì)數(shù)器的值來(lái)選取下一條需要執(zhí)行的字節(jié)碼指令:分支、跳轉(zhuǎn)嗜历、循環(huán)宣渗、異常處理、線程恢復(fù)等基礎(chǔ)操作都會(huì)依賴這個(gè)計(jì)數(shù)器來(lái)完成梨州。每個(gè)線程都有獨(dú)立的程序計(jì)數(shù)器痕囱,用來(lái)在線程切換后能恢復(fù)到正確的執(zhí)行位置,各條線程之間的計(jì)數(shù)器互不影響摊唇,獨(dú)立存儲(chǔ)。所以它是一個(gè)“線程私有”的內(nèi)存區(qū)域涯鲁。此內(nèi)存區(qū)域是唯一一個(gè)在JVM規(guī)范中沒(méi)有規(guī)定任何OutOfMemoryError情況的區(qū)域巷查。

2.虛擬機(jī)棧 JVM Stacks

  • JVM棧是線程私有的內(nèi)存區(qū)域。它描述的是java方法執(zhí)行的內(nèi)存模型抹腿,每個(gè)方法執(zhí)行的同時(shí)都會(huì)創(chuàng)建一個(gè)棧幀(Stack Frame)用于存儲(chǔ)局部變量表岛请、操作數(shù)棧、動(dòng)態(tài)鏈接警绩、方法出口等信息崇败。每個(gè)方法從調(diào)用直至完成的過(guò)程,都對(duì)應(yīng)著一個(gè)棧幀從入棧到出棧的過(guò)程肩祥。每當(dāng)一個(gè)方法執(zhí)行完成時(shí)后室,該棧幀就會(huì)彈出棧幀的元素作為這個(gè)方法的返回值,并且清除這個(gè)棧幀混狠,Java棧的棧頂?shù)臈褪钱?dāng)前正在執(zhí)行的活動(dòng)棧岸霹,也就是當(dāng)前正在執(zhí)行的方法。就像是組成動(dòng)畫的一幀一幀的圖片将饺,方法的調(diào)用過(guò)程也是由棧幀切換來(lái)產(chǎn)生結(jié)果贡避。
  • 局部變量表存放了編譯器可知的各種基本數(shù)據(jù)類型(int痛黎、short、byte刮吧、char湖饱、double、float杀捻、long井厌、boolean)、對(duì)象引用(reference類型水醋,它不等同于對(duì)象本身旗笔,可能是一個(gè)指向?qū)ο笃鹗嫉刂返囊弥羔槪部赡苁侵赶蛞粋€(gè)代表對(duì)象的句柄或其他與此對(duì)象相關(guān)的位置)和returnAddress類型(指向了一跳字節(jié)碼指令的地址)拄踪。
  • 在JVM規(guī)范中蝇恶,對(duì)這個(gè)區(qū)域規(guī)定了兩種異常情況:如果線程請(qǐng)求的棧深度大于虛擬機(jī)允許的深度,將拋出StackOverflowError異常惶桐;如果虛擬機(jī)棿榛。可以動(dòng)態(tài)擴(kuò)展,在擴(kuò)展時(shí)無(wú)法申請(qǐng)到足夠的內(nèi)存姚糊,就會(huì)拋出OutOfMemoryError異常贿衍。

3.本地方法棧 Native Method Stack

  • 本地方法棧和虛擬機(jī)棧所發(fā)揮的作用是很相似的,它們之間的區(qū)別不過(guò)是 虛擬機(jī)棧為虛擬機(jī)執(zhí)行Java方法(字節(jié)碼)服務(wù)救恨,而本地方法棧則為虛擬機(jī)使用到的Native方法服務(wù)贸辈。Sun HotSpot 直接就把本地方法棧和虛擬機(jī)棧合二為一。本地方法棧也會(huì)拋出StackOverflowError和OutOfMemoryError異常肠槽。

4.堆Heap

  • Heap是OOM故障最主要的發(fā)源地擎淤,它存儲(chǔ)著幾乎所有的實(shí)例對(duì)象,堆由垃圾收集器自動(dòng)回收秸仙,堆區(qū)由各子線程共享使用嘴拢;通常情況下,它占用的空間是所有內(nèi)存區(qū)域中最大的寂纪,但如果無(wú)節(jié)制地創(chuàng)建大量對(duì)象席吴,也容易消耗完所有的空間;堆的內(nèi)存空間既可以固定大小捞蛋,也可運(yùn)行時(shí)動(dòng)態(tài)地調(diào)整孝冒,通過(guò)如下參數(shù)設(shè)定初始值和最大值,比如
-Xms256M. -Xmx1024M

其中-X表示它是JVM運(yùn)行參數(shù)

  • ms是memorystart的簡(jiǎn)稱 最小堆容量
  • mx是memory max的簡(jiǎn)稱 最大堆容量
  • 對(duì)于大多數(shù)應(yīng)用來(lái)說(shuō)拟杉,Java堆(Heap)是JVM所管理的內(nèi)存中最大的一塊迈倍。它是被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建捣域。主要用來(lái)存放對(duì)象實(shí)例啼染,所有的對(duì)象實(shí)例以及數(shù)組都要在堆上分配宴合。堆是垃圾收集器管理的主要區(qū)域,也被稱為“GC堆”迹鹅,從內(nèi)存回收的角度來(lái)看卦洽,堆可以細(xì)分為:新生代和老年代;再細(xì)致一點(diǎn)可分為:Eden空間斜棚、From Survivor空間阀蒂、To Survivor空間(空間分配比例是8:1:1)。如果在堆中沒(méi)有內(nèi)存完成實(shí)例分配弟蚀,并且堆也無(wú)法再擴(kuò)展時(shí)蚤霞,將拋出OutOfMemoryError異常。

5.Metaspace元空間

  • 在JDK1.8中义钉,永久代已經(jīng)不存在昧绣,存儲(chǔ)的類信息、編譯后的代碼數(shù)據(jù)等已經(jīng)移動(dòng)到了MetaSpace(元空間)中捶闸,元空間并沒(méi)有處于堆內(nèi)存上夜畴,而是直接占用的本地內(nèi)存(NativeMemory)。
  • 元空間的本質(zhì)和永久代類似删壮,都是對(duì)JVM規(guī)范中方法區(qū)的實(shí)現(xiàn)贪绘。
  • 不過(guò)元空間與永久代之間最大的區(qū)別在于:元空間并不在虛擬機(jī)中,而是使用本地內(nèi)存央碟。
  • 元空間的大小僅受本地內(nèi)存限制税灌,可以通過(guò)以下參數(shù)來(lái)指定元空間大小:
    • -XX:MetaspaceSize亿虽,初始空間大小菱涤,達(dá)到該值就會(huì)觸發(fā)垃圾收集進(jìn)行類型卸載,同時(shí)GC會(huì)對(duì)該值進(jìn)行調(diào)整:如果釋放了大量的空間经柴,就適當(dāng)降低該值狸窘;如果釋放了很少的空間墩朦,那么在不超過(guò)MaxMetaspaceSize時(shí)坯认,適當(dāng)提高該值
    • -XX:MaxMetaspaceSize,最大空間氓涣,默認(rèn)是沒(méi)有限制的
    • -XX:MinMetaspaceFreeRatio牛哺,在GC之后,最小的Metaspace剩余空間容量的百分比劳吠,減少為分配空間所導(dǎo)致的垃圾收集
    • -XX:MaxMetaspaceFreeRatio引润,在GC之后,最大的Metaspace剩余空間容量的百分比痒玩,減少為釋放空間所導(dǎo)致的垃圾收集

Java8為什么要將永久代替換成Metaspace淳附?

  • 1议慰、字符串存在永久代中,容易出現(xiàn)性能問(wèn)題和內(nèi)存溢出奴曙。
  • 2别凹、類及方法的信息等比較難確定其大小,因此對(duì)于永久代的大小指定比較困 難洽糟,太小容易出現(xiàn)永久代溢出炉菲,太大則容易導(dǎo)致老年代溢出。
  • 3坤溃、永久代會(huì)為 GC 帶來(lái)不必要的復(fù)雜度拍霜,并且回收效率偏低。
  • 4薪介、Oracle 可能會(huì)將HotSpot 與 JRockit 合二為一祠饺。

推薦學(xué)習(xí)博客 JVM內(nèi)存模型看這個(gè)就夠了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市昭灵,隨后出現(xiàn)的幾起案子吠裆,更是在濱河造成了極大的恐慌,老刑警劉巖烂完,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件试疙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡抠蚣,警方通過(guò)查閱死者的電腦和手機(jī)祝旷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嘶窄,“玉大人怀跛,你說(shuō)我怎么就攤上這事”澹” “怎么了吻谋?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)现横。 經(jīng)常有香客問(wèn)我漓拾,道長(zhǎng),這世上最難降的妖魔是什么戒祠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任骇两,我火速辦了婚禮,結(jié)果婚禮上姜盈,老公的妹妹穿的比我還像新娘低千。我一直安慰自己,他們只是感情好馏颂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布示血。 她就那樣靜靜地躺著棋傍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪难审。 梳的紋絲不亂的頭發(fā)上舍沙,一...
    開(kāi)封第一講書(shū)人閱讀 51,610評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音剔宪,去河邊找鬼拂铡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛葱绒,可吹牛的內(nèi)容都是我干的感帅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼地淀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼失球!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起帮毁,我...
    開(kāi)封第一講書(shū)人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤实苞,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后烈疚,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體黔牵,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年爷肝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了猾浦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡灯抛,死狀恐怖金赦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情对嚼,我是刑警寧澤夹抗,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站纵竖,受9級(jí)特大地震影響漠烧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜磨确,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一沽甥、第九天 我趴在偏房一處隱蔽的房頂上張望声邦。 院中可真熱鬧乏奥,春花似錦、人聲如沸亥曹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至骗炉,卻和暖如春照宝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背句葵。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工厕鹃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乍丈。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓剂碴,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親轻专。 傳聞我的和親對(duì)象是個(gè)殘疾皇子忆矛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

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

  • 官方文檔規(guī)定的運(yùn)行時(shí)數(shù)據(jù)區(qū)域 官方文檔中規(guī)定的運(yùn)行時(shí)數(shù)據(jù)區(qū)一共就幾塊: PC計(jì)數(shù)器, 虛擬機(jī)棧, 本地方法棧, 堆...
    程序員日常填坑閱讀 505評(píng)論 0 0
  • 雖然說(shuō)了解虛擬機(jī)的運(yùn)作并不是一般開(kāi)發(fā)人員必須掌握的知識(shí),但是對(duì)于中高級(jí)開(kāi)發(fā)人員來(lái)說(shuō)请垛,如果不了解JVM一些技術(shù)特性的...
    泰迪的bagwell閱讀 6,072評(píng)論 0 12
  • 嗚拉嗚拉巴巴巴巴巴爸爸催训,爸爸巴巴爸爸巴巴爸爸,巴巴爸爸宗收,巴巴爸爸漫拭,巴巴爸爸巴巴爸爸,巴巴巴巴哦混稽,888888888...
    曉曉_1e21閱讀 553評(píng)論 0 0
  • 看一眼 你就明白我在想什么 結(jié)婚十年后是這樣的生活 這是第一首三行詩(shī)嫂侍,因?yàn)榭旎顪蠋熍e辦的征文而寫。確實(shí)不會(huì)寫荚坞,也...
    劉一鳴媽媽閱讀 785評(píng)論 17 30
  • 哎挑宠,這周單休,實(shí)在太累颓影,就簡(jiǎn)單總結(jié)一下linux操作命令吧各淀。原諒我,下周再更新一篇數(shù)據(jù)結(jié)構(gòu)的文章诡挂。 一.目錄切換...
    taobingzhi閱讀 1,591評(píng)論 2 12