JVM內(nèi)存模型概述

距離上次文章已經(jīng)半個多月了泵肄,一來是工作實(shí)在是忙不開腐巢,二來是偷懶了玄括!近日,看到一個面試題目遭京,就是描述一下JVM內(nèi)存模型泞莉,故在此總結(jié)一番鲫趁,希望讀者能夠更好的理解JVM內(nèi)存模型捺弦。

1.JVM內(nèi)存模型簡介

JVM定義了不同運(yùn)行時數(shù)據(jù)區(qū),他們是用來執(zhí)行應(yīng)用程序的幽崩。某些區(qū)域隨著JVM啟動及銷毀寞钥,另外一些區(qū)域的數(shù)據(jù)是線程性獨(dú)立的,隨著線程創(chuàng)建和銷毀蹄溉。jvm內(nèi)存模型總體架構(gòu)圖如下:(摘自oracle官方網(wǎng)站

Oracle官方給出的JVM內(nèi)存模型

JVM在執(zhí)行Java程序時您炉,會把它管理的內(nèi)存劃分為若干個的區(qū)域,每個區(qū)域都有自己的用途和創(chuàng)建銷毀時間棉胀。如下圖所示冀膝,可以分為兩大部分,線程私有區(qū)和共享區(qū)麻掸。下圖是根據(jù)自己理解畫的一個JVM內(nèi)存模型架構(gòu)圖:

JVM內(nèi)存分為線程私有區(qū)和線程共享區(qū)

安利:上圖是利用在線畫圖工具processon赐纱,我也是剛上手,個人感覺還不錯诚隙,各種圖例都有淫痰,在此安利一下!

2.內(nèi)存模型

2.1.線程私有區(qū)

2.1.1 程序計數(shù)器

當(dāng)同時進(jìn)行的線程數(shù)超過CPU數(shù)或其內(nèi)核數(shù)時籽孙,就要通過時間片輪詢分派CPU的時間資源,不免發(fā)生線程切換犯建。這時,每個線程就需要一個屬于自己的計數(shù)器來記錄下一條要運(yùn)行的指令竿开。如果執(zhí)行的是JAVA方法,計數(shù)器記錄正在執(zhí)行的java字節(jié)碼地址否彩,如果執(zhí)行的是native方法嗦随,則計數(shù)器為空。

2.1.2 虛擬機(jī)棧

線程私有的贴浙,與線程在同一時間創(chuàng)建署恍。管理JAVA方法執(zhí)行的內(nèi)存模型。每個方法執(zhí)行時都會創(chuàng)建一個楨棧來存儲方法的的變量表盯质、操作數(shù)棧、動態(tài)鏈接方法般婆、返回值朵逝、返回地址等信息乡范。棧的大小決定了方法調(diào)用的可達(dá)深度(遞歸多少層次,或嵌套調(diào)用多少層其他方法渠脉,-Xss參數(shù)可以設(shè)置虛擬機(jī)棧大小)芋膘。棧的大小可以是固定的,或者是動態(tài)擴(kuò)展的臂拓。如果請求的棧深度大于最大可用深度,則拋出stackOverflowError胶惰;如果棧是可動態(tài)擴(kuò)展的霞溪,但沒有內(nèi)存空間支持?jǐn)U展,則拋出OutofMemoryError坊饶。
使用jclasslib工具可以查看class類文件的結(jié)構(gòu)殴蓬。下圖為棧幀結(jié)構(gòu)圖:

JVM棧楨結(jié)構(gòu)

2.1.3 本地方法棧

與虛擬機(jī)棧作用相似。但它不是為Java方法服務(wù)的根蟹,而是本地方法(C語言)糟秘。由于規(guī)范對這塊沒有強(qiáng)制要求,不同虛擬機(jī)實(shí)現(xiàn)方法不同散庶。

2.2.線程共享區(qū)

此區(qū)域是用來存儲被各線程共享的數(shù)據(jù)的。

2.2.1 方法區(qū)

線程共享的悲龟,用于存放被虛擬機(jī)加載的類的元數(shù)據(jù)信息冰寻,如常量、靜態(tài)變量和即時編譯器編譯后的代碼轻腺。若要分代划乖,算是永久代(老年代),以前類大多“static”的琴庵,很少被卸載或收集仰美,現(xiàn)回收廢棄常量和無用的類筒占。其中運(yùn)行時常量池存放編譯生成的各種常量蜘犁。(如果hotspot虛擬機(jī)確定一個類的定義信息不會被使用,也會將其回收奏窑。回收的基本條件至少有:所有該類的實(shí)例被回收埃唯,而且裝載該類的ClassLoader被回收)

2.2.2 堆

存放對象實(shí)例和數(shù)組鹰晨,是垃圾回收的主要區(qū)域,分為新生代和老年代漠趁。剛創(chuàng)建的對象在新生代的Eden區(qū)中忍疾,經(jīng)過GC后進(jìn)入新生代的S0區(qū)中,再經(jīng)過GC進(jìn)入新生代的S1區(qū)中卤妒,15次GC后仍存在就進(jìn)入老年代。這是按照一種回收機(jī)制進(jìn)行劃分的共缕,不是固定的士复。若堆的空間不夠?qū)嵗峙洌瑒tOutOfMemoryError蜓萄。

JVM堆結(jié)構(gòu)
Young Generation      即圖中的Eden + From Space(s0) + To Space(s1)
Eden                        存放新生的對象
Survivor Space          有兩個澄峰,存放每次垃圾回收后存活的對象(s0+s1)
Old Generation          Tenured Generation 即圖中的Old Space
                        主要存放應(yīng)用程序中生命周期長的存活對象

2.3堆和棧的區(qū)別

棧是運(yùn)行時單位辟犀,代表著邏輯绸硕,內(nèi)含基本數(shù)據(jù)類型和堆中對象引用玻佩,所在區(qū)域連續(xù)席楚,沒有碎片;堆是存儲單位烦秩,代表著數(shù)據(jù),可被多個棧共享(包括成員中基本數(shù)據(jù)類型兜蠕、引用和引用對象)抛寝,所在區(qū)域不連續(xù),會有碎片盗舰。

2.3.1功能不同

棧內(nèi)存用來存儲局部變量和方法調(diào)用,而堆內(nèi)存用來存儲Java中的對象郊霎。無論是成員變量爷绘,局部變量,還是類變量土至,它們指向的對象都存儲在堆內(nèi)存中。

2.3.2共享性不同

棧內(nèi)存是線程私有的骡苞。
堆內(nèi)存是所有線程共有的楷扬。

2.3.3異常錯誤不同

如果棧內(nèi)存或者堆內(nèi)存不足都會拋出異常。
椂阒辏空間不足:java.lang.StackOverFlowError。
堆空間不足:java.lang.OutOfMemoryError霜定。

2.3.4空間大小

棧的空間大小遠(yuǎn)遠(yuǎn)小于堆的。

2.4參考鏈接

http://www.cnblogs.com/AloneSword/p/4262255.html
http://www.reibang.com/p/6ff6bdb22439

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辖所,一起剝皮案震驚了整個濱河市磨德,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌典挑,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幅虑,死亡現(xiàn)場離奇詭異顾犹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)擎宝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門绍申,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人极阅,你說我怎么就攤上這事涨享。” “怎么了厕隧?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵吁讨,是天一觀的道長。 經(jīng)常有香客問我建丧,道長,這世上最難降的妖魔是什么涣雕? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任闭翩,我火速辦了婚禮,結(jié)果婚禮上疗韵,老公的妹妹穿的比我還像新娘。我一直安慰自己蕉汪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布福澡。 她就那樣靜靜地躺著驹马,像睡著了一般。 火紅的嫁衣襯著肌膚如雪算利。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天效拭,我揣著相機(jī)與錄音缎患,去河邊找鬼。 笑死较锡,一個胖子當(dāng)著我的面吹牛盗痒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播俯邓,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鸟整!你這毒婦竟也來了朦蕴?” 一聲冷哼從身側(cè)響起弟头,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤赴恨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后伦连,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惑淳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年歧焦,在試婚紗的時候發(fā)現(xiàn)自己被綠了肚医。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡痕貌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出舵稠,到底是詐尸還是另有隱情,我是刑警寧澤哺徊,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布落追,位于F島的核電站,受9級特大地震影響轿钠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疗垛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一硫朦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泽裳,春花似錦、人聲如沸涮总。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔑鹦。三九已至,卻和暖如春铺纽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狡门。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工锅很, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人爆安。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓扔仓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親翘簇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

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