Java內(nèi)存區(qū)域與內(nèi)存溢出異常

本文為 《深入理解Java虛擬機》第二章內(nèi)容的學(xué)習(xí)筆記,部分內(nèi)容經(jīng)過二次加工泡挺。若對相關(guān)知識感興趣,推薦購書深入閱讀命浴。若認(rèn)為文章涉嫌侵權(quán)娄猫,請聯(lián)系作者及時刪除贱除。
本作品采用 知識共享署名-非商業(yè)性使用-相同方式共享 3.0 中國大陸許可協(xié)議 (CC BY-NC-SA 3.0 CN) 進行許可 。非商業(yè)性質(zhì)轉(zhuǎn)載請注明作者和出處媳溺,禁止商業(yè)性質(zhì)轉(zhuǎn)載月幌。
開源創(chuàng)造世界

個人練習(xí)代碼:https://github.com/dreamerfable/Understanding-the-JVM

運行時數(shù)據(jù)區(qū)域

根據(jù) JVM規(guī)范,Java虛擬機鎖管理的內(nèi)存包括以下幾個運行時區(qū)域

各線程獨立存儲褂删,互不影響的內(nèi)存飞醉,稱作線程私有的內(nèi)存

Program Counter Register

程序計數(shù)器是一塊較小的內(nèi)存空間,可以看做是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器屯阀,分支缅帘、循環(huán)、跳轉(zhuǎn)难衰、異常處理等基礎(chǔ)功能都需要依賴它完成

線程私有

這個區(qū)域不存在OutOfMemoryError情況

Virtual Machine Stack

虛擬機棧描述的是Java方法執(zhí)行的內(nèi)存模型钦无,每個方法在執(zhí)行的同時都會創(chuàng)建一個棧幀 Stack Frame,用于存儲局部變量表盖袭、操作數(shù)棧失暂、動態(tài)鏈接、方法出口等信息鳄虱。每一個方法調(diào)用直至執(zhí)行完成的過程弟塞,對應(yīng)著一個棧幀在虛擬機棧中入棧到出棧的過程拙已。

線程私有

如果線程請求的棧深度大于虛擬機所允許的深度决记,拋出StackOverflowError
如果虛擬機棧可以動態(tài)擴展倍踪,擴展時如果無法申請到足夠的內(nèi)存系宫,拋出OutOfMemoryError異常

Native Method Stack

本地方法棧與VM Stack作用類似。不同的是建车,VM Stack 為虛擬機執(zhí)行Java方法服務(wù)扩借,而本地方法棧為虛擬機使用到的Native方法服務(wù)

虛擬機規(guī)范對本地方法棧沒有強制規(guī)定缤至,部分虛擬機把本地方法棧與虛擬機棧合二為一潮罪,如HotSpot

會拋出StackOverflowError和OutOfMemoryError。

Heap

堆领斥,是被所有線程共享的一塊內(nèi)存區(qū)域错洁,在虛擬機啟動時創(chuàng)建。用于存放對象實例戒突,幾乎所有對象實例都在這里分配內(nèi)存

堆是垃圾收集器管理的主要區(qū)域描睦。從內(nèi)存回收角度看膊存,由于現(xiàn)在收集器基本都采用分代收集算法,所以堆可以細(xì)分為:新生代、老年代隔崎;再細(xì)致可以分為Eden空間今艺、From Survivor空間、To Survivor空間等爵卒。

在堆中沒有內(nèi)存完成實例分配虚缎,并且堆也無法再擴展時,拋出OutOfMemoryError異常钓株。

Method Area

方法區(qū)也是被所有線程共享的內(nèi)存區(qū)域实牡,用于存儲已被虛擬機加載的類信息、常量轴合、靜態(tài)變量创坞、即時編譯器編譯后的代碼等

JVM規(guī)范將其描述為堆的一個邏輯部分受葛,但其別名為 Non-Heap题涨,用來將其與堆加以區(qū)分。

根據(jù)JVM規(guī)范总滩,當(dāng)方法區(qū)無法滿足內(nèi)存分配需求時纲堵,將拋出OutOfMemoryError異常。

Runtime Constant Pool

運行時常量池用于存放Class文件中的常量池

常量池 Constant Pool Table 在Class文件中用于存放編譯期生成的各種字面量和符號引用闰渔,這部分內(nèi)容在類加載后會進入Method Area的運行時常量池席函。

運行時常量池除了保存Class文件中描述的符號引用外,還會把翻譯出來的直接引用也存儲下來澜建。另外向挖,運行時常量池相比較于Class文件常量池具有動態(tài)性,可以保存運行時產(chǎn)生的常量炕舵。

無法再申請到內(nèi)存時拋出OutOfMemoryError異常何之。

Direct Memory

直接內(nèi)存 不是虛擬機運行時數(shù)據(jù)區(qū)的一部分,也不是JVM規(guī)范中定義的內(nèi)存區(qū)域咽筋。但這部分同樣被頻繁的使用溶推,而且也可能導(dǎo)致OutOfMemoryError異常出現(xiàn)。

JDK1.4中新加入的NIO類奸攻,引入了一種基于通道 Channel 與 緩沖區(qū) Buffer 的 I/O方式蒜危,它可以使用Native函數(shù)庫直接分配堆外內(nèi)存,然后通過一個存儲在Java堆中的DirectByteBuffer對象作為這塊內(nèi)存的引用進行操作睹耐。這樣能在一些場景中顯著提高性能辐赞,因為避免了在Java堆和Native堆中來回復(fù)制數(shù)據(jù)。

本季直接內(nèi)存的分配不會受到Java堆大小的限制硝训,但是其受到本機總內(nèi)存大小以及處理器尋址空間的限制响委,可能會導(dǎo)致動態(tài)擴展時出現(xiàn)OutOfMemoryError異常新思。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市赘风,隨后出現(xiàn)的幾起案子夹囚,更是在濱河造成了極大的恐慌,老刑警劉巖邀窃,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荸哟,死亡現(xiàn)場離奇詭異,居然都是意外死亡瞬捕,警方通過查閱死者的電腦和手機鞍历,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來山析,“玉大人堰燎,你說我怎么就攤上這事∷窆欤” “怎么了秆剪?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長爵政。 經(jīng)常有香客問我仅讽,道長,這世上最難降的妖魔是什么钾挟? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任洁灵,我火速辦了婚禮,結(jié)果婚禮上掺出,老公的妹妹穿的比我還像新娘徽千。我一直安慰自己,他們只是感情好汤锨,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布双抽。 她就那樣靜靜地躺著,像睡著了一般闲礼。 火紅的嫁衣襯著肌膚如雪牍汹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天柬泽,我揣著相機與錄音慎菲,去河邊找鬼。 笑死锨并,一個胖子當(dāng)著我的面吹牛露该,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播第煮,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼解幼,長吁一口氣:“原來是場噩夢啊……” “哼闸拿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起书幕,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎揽趾,沒想到半個月后台汇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡篱瞎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年苟呐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俐筋。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡牵素,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出澄者,到底是詐尸還是另有隱情笆呆,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布粱挡,位于F島的核電站赠幕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏询筏。R本人自食惡果不足惜榕堰,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嫌套。 院中可真熱鬧逆屡,春花似錦、人聲如沸踱讨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勇蝙。三九已至沫勿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間味混,已是汗流浹背产雹。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留翁锡,地道東北人蔓挖。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像馆衔,于是被迫代替她去往敵國和親瘟判。 傳聞我的和親對象是個殘疾皇子怨绣,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355

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