JVM內存模型詳解

JVM內存模型詳解

1.基本概念

JVM實際上是運行在一個具體操作系統(tǒng)上的程序進程撒妈,對Java代碼而言恢暖,JVM就是操作系統(tǒng)的代理。

JVM內存模型

如圖所示是JVM的內存模型及數(shù)據交互狰右。JVM的內存模型依然是基于操作系統(tǒng)進程空間的杰捂,不過是自己設計了一套內存管理體系以支撐上層的Java代碼。

JVM的運行時內存可以簡單的分為線程私有和公共內存棋蚌,線程私有部分包含程序計數(shù)器嫁佳、Java棧、native方法棧谷暮。全局公共部分包含方法區(qū)蒿往、堆空間。

2.程序計數(shù)器

不止是JVM湿弦,操作系統(tǒng)本身就有程序計數(shù)器的概念瓤漏,可以把JVM的程序計數(shù)器看做是對操作系統(tǒng)本身程序計數(shù)器的一種抽象。

程序計數(shù)器會記錄當前線程下一條字節(jié)碼的位置。當線程被掛起然后被恢復的時候蔬充,會根據程序計數(shù)器恢復線程的執(zhí)行邏輯俯在。特別的,如果該線程正在執(zhí)行一個native方法娃惯,那么此時線程寄存器的值為”undefined”。

3.Java方法棧

Java棧也是線程私有的肥败。每個方法在執(zhí)行的時候都會同時生成一個棧幀趾浅,用于存儲局部變量、操作數(shù)棧馒稍、動態(tài)鏈接皿哨、方法出口等信息。方法執(zhí)行從開始到結束的過程纽谒,對應了棧幀在虛擬機Java棧中從入棧到出棧的過程证膨。

局部變量表中存儲了基本類型及引用類型(即對象的指針),其中64位長度的long和double類型的數(shù)據會占用2個局部變量空間(Slot)鼓黔,其余的數(shù)據類型只占用1個央勒。局部變量表所需的內存空間在編譯期間完成分配,當進入一個方法時澳化,這個方法需要在幀中分配多大的局部變量空間是完全確定的崔步,在方法運行期間不會改變局部變量表的大小。

4.native方法棧

native方法棧與Java方法棧類似缎谷,不過native方法棧是為虛擬機使用到的native方法服務的井濒。

Java虛擬機規(guī)范對于這塊沒有強制規(guī)定,因此Sun HotSpot甚至直接就把native方法棧和Java方法棧合二為一列林。

5.Java堆

Java堆(Java Heap)是Java虛擬機所管理的內存中最大的一塊瑞你。Java堆是被所有線程共享的一塊內存區(qū)域,在虛擬機啟動時創(chuàng)建希痴。此內存區(qū)域的唯一目的就是存放對象實例者甲,幾乎所有的對象實例都在這里分配內存。這一點在Java虛擬機規(guī)范中的描述是:所有的對象實例以及數(shù)組都要在堆上分配润梯。

Java堆是垃圾收集器管理的主要區(qū)域过牙,因此很多時候也被稱做“GC堆”。關于Java堆的詳細結構纺铭,也需要和GC機制一起來講才能比較清楚的理解寇钉,此處先跳過。

通過虛擬機啟動參數(shù)舶赔,我們可以控制Java堆的最大內存占用扫倡,如果超過最大內存,會觸發(fā)OutOfMemory異常,進而導致內存申請失敗撵溃。如果出現(xiàn)這種異常疚鲤,就要考慮是參數(shù)設置太小還是存在堆內存泄露。

6.方法區(qū)

方法區(qū)(Method Area)與Java堆一樣缘挑,是各個線程共享的內存區(qū)域集歇,它用于存儲已被虛擬機加載的類信息、常量语淘、靜態(tài)變量诲宇、即時編譯器編譯后的代碼等數(shù)據。雖然Java虛擬機規(guī)范把方法區(qū)描述為堆的一個邏輯部分惶翻,但是它卻有一個別名叫做Non-Heap(非堆)姑蓝,目的應該是與Java堆區(qū)分開來。

對于習慣在HotSpot虛擬機上開發(fā)吕粗、部署程序的開發(fā)者來說纺荧,很多人都更愿意把方法區(qū)稱為“永久代”(Permanent Generation),本質上兩者并不等價颅筋,僅僅是因為HotSpot虛擬機的設計團隊選擇把GC分代收集擴展至方法區(qū)宙暇,或者說使用永久代來實現(xiàn)方法區(qū)而已,這樣HotSpot的垃圾收集器可以像管理Java堆一樣去管理這部分內存议泵。

但是使用永久代來實現(xiàn)方法區(qū)客给,并不是一個好主意,因為這樣更加容易遇到內存溢出問題肢簿,永久代的內存分配一般比較小且固定靶剑,但是當碰到String.intern這種運行時占用永久代內存空間的方法的時候,很容易導致永久代內存不夠用池充。因此在jdk1.7中桩引,已經把放在永久代中的字符串常量池移入到堆內存當中了。

7.運行時常量池

運行時常量池是方法區(qū)的一部分收夸,存放了class文件在編譯期生成的各種字面量和符號引用坑匠。這部分內容在類加載的時候放入運行時常量池中。

運行時常量池是動態(tài)變化的卧惜,不止存儲了class文件在編譯期生成的各種字面量厘灼,運行期間也可能放入新的常量,比如String類的intern方法咽瓷。

8.直接內存

直接內存并不是虛擬機運行時區(qū)域的一部分设凹,也不是Java虛擬機規(guī)范定義的內存區(qū)域。JDK 1.4中新加入的NIO類茅姜,引入了一種基于通道和緩沖區(qū)的I/O方式闪朱,它可以使用native函數(shù)庫直接分配堆外內存,然后通過一個存儲在Java堆中的DirectByteBuffer對象作為這塊內存的引用進行操作。這樣做是為了能在一些場景中顯著提高性能奋姿,因為避免了Java堆和native堆來回復制數(shù)據锄开。

本機直接內存的分配不受到Java堆的大小限制,但會受到物理內存和操作系統(tǒng)的限制称诗。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末萍悴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子寓免,更是在濱河造成了極大的恐慌退腥,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件再榄,死亡現(xiàn)場離奇詭異,居然都是意外死亡享潜,警方通過查閱死者的電腦和手機困鸥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剑按,“玉大人疾就,你說我怎么就攤上這事∫蘸” “怎么了猬腰?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長猜敢。 經常有香客問我姑荷,道長,這世上最難降的妖魔是什么缩擂? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任鼠冕,我火速辦了婚禮,結果婚禮上胯盯,老公的妹妹穿的比我還像新娘懈费。我一直安慰自己,他們只是感情好博脑,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布憎乙。 她就那樣靜靜地躺著,像睡著了一般叉趣。 火紅的嫁衣襯著肌膚如雪泞边。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天疗杉,我揣著相機與錄音繁堡,去河邊找鬼。 笑死,一個胖子當著我的面吹牛椭蹄,可吹牛的內容都是我干的闻牡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼绳矩,長吁一口氣:“原來是場噩夢啊……” “哼罩润!你這毒婦竟也來了?” 一聲冷哼從身側響起翼馆,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤割以,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后应媚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體严沥,經...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年中姜,在試婚紗的時候發(fā)現(xiàn)自己被綠了消玄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡丢胚,死狀恐怖翩瓜,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情携龟,我是刑警寧澤兔跌,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站峡蟋,受9級特大地震影響惯悠,放射性物質發(fā)生泄漏棒厘。R本人自食惡果不足惜希停,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一拔莱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧匿又,春花似錦方灾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至痛单,卻和暖如春嘿棘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背旭绒。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工鸟妙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留焦人,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓重父,卻偏偏與公主長得像花椭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子房午,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內容