JAVA虛擬機(jī)之運(yùn)行時數(shù)據(jù)區(qū)域

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

運(yùn)行時數(shù)據(jù)區(qū)域主要分為:堆桃漾,棧坏匪,方法區(qū),程序計數(shù)器撬统。實(shí)際上适滓,我們所說的棧又分為:java虛擬機(jī)棧,本地方法棧恋追。

1. 程序計數(shù)器
  • 概念

    程序計數(shù)器就是當(dāng)前線程執(zhí)行字節(jié)碼的行號指示器凭迹。(這里我們看java虛擬機(jī)的時候,不再考慮程序或者我們寫的java代碼苦囱,而是 字節(jié)碼)嗅绸。。

  • 特征

    • 為了線程切換后能回到正確的位置撕彤,因此每一個線程都有一個程序計數(shù)器朽砰,這樣子程序計數(shù)器各自互不影響,是線程私有內(nèi)存喉刘。

    • 內(nèi)存區(qū)域里唯一一個不會出現(xiàn)內(nèi)存泄露和內(nèi)存溢出問題的區(qū)域。

    • 當(dāng)執(zhí)行執(zhí)行的是本地方法時漆弄,程序計數(shù)器指向空(undifined)睦裳,否則,程序計數(shù)器正常指向撼唾。

2.java虛擬機(jī)棧
  • 概念

    java虛擬機(jī)棧描述的是java方法執(zhí)行的內(nèi)存模型廉邑,存儲的是棧幀。當(dāng)一個方法被調(diào)用倒谷,表示棧幀入棧蛛蒙,當(dāng)方法調(diào)用完畢返回時,表示棧幀出棧渤愁。那么棧幀是什么呢牵祟?

    • 什么是棧幀?

      棧幀可以理解為一個方法的運(yùn)行空間抖格,主要包括四部分:變量表诺苹,操作數(shù)棧,動態(tài)鏈接雹拄,返回地址(方法出口)

      如圖所示:

    java虛擬機(jī)棧.png
    ?

    其中:

    ? **frame**表示棧幀收奔。隨著方法的調(diào)用而入棧,調(diào)用結(jié)束或者返回異常而出棧滓玖。

    ? **local variables**表示局部變量表坪哄,是一個具有物理地址連續(xù)的內(nèi)存空間,最小單位是Slot。用來存放方法參數(shù)和方法內(nèi)部定義的局部變量翩肌。虛擬機(jī)沒有明確指明一個Slot的內(nèi)存空間大小模暗。但是boolean、byte摧阅、char汰蓉、short、int棒卷、float顾孽、reference、returnAddress類型的數(shù)據(jù)都可以用32位空間或更小的內(nèi)存來存放比规。這些類型占用一個Slot若厚。Java中的long和double類型是64位,占用兩個Slot蜒什。Slot的空間是可以復(fù)用的测秸,當(dāng)pc計數(shù)器的值已經(jīng)超出了某個變量的作用域時,下一個變量不必使用新的Slot空間灾常,可以去覆蓋前面那個空間

    ? **operand stack**操作數(shù)棧霎冯,當(dāng)一個方法剛剛開始的時候,這個方法的操作數(shù)棧是空的钞瀑,在方法的執(zhí)行過程中沈撞,會有各種字節(jié)碼指令往操作數(shù)棧中寫入和提取內(nèi)容,也就是入棧和出棧操作.

    ? **動態(tài)鏈接**雕什,一個方法A調(diào)用另一個方法B缠俺,或者一個類使用另一個類的成員變量時,總得知道被調(diào)用者的名字吧贷岸?在Class文件中的常量池中存有大量的符號引用壹士,而被調(diào)用者有個這樣的符號引用叫做BB,那么在運(yùn)行期字節(jié)碼獲取到的是BB偿警,然后直接將BB轉(zhuǎn)為方法B來調(diào)用躏救,這個在運(yùn)行期將符號應(yīng)用轉(zhuǎn)化為直接引用成為動態(tài)鏈接。

    ? **return value**螟蒸,返回值落剪。如果方法正常結(jié)束調(diào)用,則返回方法定義的返回值尿庐。如果是異常結(jié)束調(diào)用忠怖,則不會返回方法值給調(diào)用者。
  • 特征

    • 當(dāng)進(jìn)入一個調(diào)用方法時抄瑟,局部變量表在編譯期間已完成分配凡泣,在運(yùn)行期間不會變更大小了枉疼。

    • (StackOverflowError):當(dāng)當(dāng)前線程申請的java虛擬機(jī)棧空間大于允許的java虛擬機(jī)棧大小時鞋拟,會拋出StackOverflowError骂维。一般而言,java虛擬機(jī)中贺纲,-Xss 設(shè)置棧的大小航闺,棧的大小直接決定函數(shù)調(diào)用的可達(dá)深度

    • (OutOfMemoryError):如果java虛擬機(jī)是允許可動態(tài)擴(kuò)展的,當(dāng)擴(kuò)展時無法申請到足夠內(nèi)存猴誊,會拋出OutOfMemoryError異常潦刃。

3.本地方發(fā)棧
  • 概念

    本地方發(fā)棧和java虛擬機(jī)棧功能十分相似,區(qū)別是java虛擬機(jī)棧是對java方法服務(wù)懈叹,而本地方發(fā)棧是對本地方法(native)方法服務(wù)乖杠。

  • 特征

    也會拋出(StackOverflowError)和(OutOfMemoryError)

4.java堆
  • 概念

    java虛擬機(jī)管理的最大的一塊內(nèi)存區(qū)域,是存放java對象的一塊被所有線程共享的區(qū)域澄成。

  • 特征

    • 如果堆中沒有足夠內(nèi)存用來儲存對象胧洒,并且堆也無法再擴(kuò)展時,則會發(fā)生(OutOfMemoryError)

    • 垃圾回收器主要管理的區(qū)域

    • 粗分為:新生代和老年代墨状。細(xì)分為:Eden空間,From survivor空間卫漫,to survivor空間。

5.方法區(qū)
  • 概念

    方法區(qū)和java堆一樣肾砂,是線程共享的汛兜,主要存放:已被虛擬機(jī)加載的類信息,常量通今,靜態(tài)常量,即時編譯器編譯后的代碼等數(shù)據(jù)肛根,比如class中一些類的版本辫塌,等信息。

  • 特征

    • 可以實(shí)現(xiàn)垃圾收集派哲,也可實(shí)現(xiàn)垃圾收集臼氨。如果實(shí)現(xiàn)垃圾收集主要針對常量池的回收和類型的卸載。

    • 方法區(qū)無法滿足內(nèi)存分配時芭届,拋出(OutOfMemoryError)

    • 常量池是方法區(qū)的一部分储矩,用于存放字面量和符號引用。在編譯時褂乍,java類并不知道所引用的類的實(shí)際地址持隧,因此只能使用符號引用來代替,這些都放在常量池中逃片。具備動態(tài)性屡拨,就是說并不只有在編譯器將字面量等信息放入到常量池,也可以在運(yùn)行期間有新增的字面量數(shù)據(jù)也可以存儲在常量池中。java運(yùn)用的比較多的是String.intern()方法呀狼。常量池也是方法區(qū)的一部分裂允,也會拋出(OutOfMemoryError)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哥艇,一起剝皮案震驚了整個濱河市绝编,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌貌踏,老刑警劉巖十饥,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異哩俭,居然都是意外死亡绷跑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門凡资,熙熙樓的掌柜王于貴愁眉苦臉地迎上來砸捏,“玉大人,你說我怎么就攤上這事隙赁】巡兀” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵伞访,是天一觀的道長掂骏。 經(jīng)常有香客問我,道長厚掷,這世上最難降的妖魔是什么弟灼? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮冒黑,結(jié)果婚禮上田绑,老公的妹妹穿的比我還像新娘。我一直安慰自己抡爹,他們只是感情好掩驱,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著冬竟,像睡著了一般欧穴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上泵殴,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天涮帘,我揣著相機(jī)與錄音,去河邊找鬼笑诅。 笑死焚辅,一個胖子當(dāng)著我的面吹牛映屋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播同蜻,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼棚点,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了湾蔓?” 一聲冷哼從身側(cè)響起瘫析,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎默责,沒想到半個月后贬循,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡桃序,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年杖虾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片媒熊。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡奇适,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芦鳍,到底是詐尸還是另有隱情嚷往,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布柠衅,位于F島的核電站皮仁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏菲宴。R本人自食惡果不足惜贷祈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望喝峦。 院中可真熱鬧势誊,春花似錦、人聲如沸愈犹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽漩怎。三九已至,卻和暖如春嗦嗡,著一層夾襖步出監(jiān)牢的瞬間勋锤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工侥祭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叁执,地道東北人茄厘。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像谈宛,于是被迫代替她去往敵國和親次哈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359

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