Java虛擬機(jī)內(nèi)存區(qū)域

概述

????經(jīng)歷過滴滴(小桔)特碳、美團(tuán)和京東面試,基本上必問知識(shí)點(diǎn)就是Java虛擬機(jī)內(nèi)存區(qū)域劃分和生命周期贴浙,今天就為大家著重介紹一下技掏,Java虛擬機(jī)有哪些內(nèi)存區(qū)域以及對(duì)應(yīng)存儲(chǔ)內(nèi)容和生命周期。
????在Java虛擬機(jī)自動(dòng)內(nèi)存管理機(jī)制的幫助下兴溜,程序員雖然已經(jīng)不需要為每一個(gè)new操作去手動(dòng)分配空間和回收侦厚;不過也正是因?yàn)槌绦騿T把內(nèi)存控制的權(quán)力交給了虛擬機(jī),如果一旦出現(xiàn)內(nèi)存泄漏和溢出方面的問題拙徽,如果不了解虛擬機(jī)是怎么使用內(nèi)存的刨沦,那么排查錯(cuò)誤將會(huì)成為一項(xiàng)異常艱難的工作。

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

????Java虛擬機(jī)在執(zhí)行程序的過程中會(huì)把它所管理的內(nèi)存劃分為若干個(gè)不同的數(shù)據(jù)區(qū)域膘怕。如下圖所示:


虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū).jpg

程序計(jì)數(shù)器

????程序計(jì)數(shù)器(Porgram Counter Register)是一塊較小的內(nèi)存空間想诅,它可以看作是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器。
????由于Java虛擬機(jī)的多線程是通過線程輪流切換并分配處理器執(zhí)行時(shí)間的方式來實(shí)現(xiàn)的淳蔼,因此侧蘸,為了多線程切換后能恢復(fù)到正確的執(zhí)行位置裁眯,每條線程都需要有一個(gè)獨(dú)立的程序計(jì)數(shù)器鹉梨,各條線程之間計(jì)數(shù)器互不影響,獨(dú)立存儲(chǔ)穿稳,我們稱這類內(nèi)存區(qū)域?yàn)椤熬€程私有”的內(nèi)存存皂。
????此內(nèi)存區(qū)域是唯一一個(gè)再Java虛擬機(jī)規(guī)范中沒有規(guī)定任何OutOfMemoryError情況的區(qū)域。

Java虛擬機(jī)棧

????與程序計(jì)數(shù)器一樣,Java虛擬機(jī)棧(Java Virtual Machine Stacks)也是線程私有的旦袋,它的生命周期與線程相同骤菠。
????每個(gè)方法在執(zhí)行的同時(shí)都會(huì)創(chuàng)建一個(gè)棧幀(Stack Frame)用于存儲(chǔ)局部變量表、操作數(shù)棧疤孕、動(dòng)態(tài)鏈接商乎、方法出口等信息。對(duì)于棧幀內(nèi)存儲(chǔ)如此之多的信息祭阀,往往不需要過多的關(guān)注鹉戚,我們只需要知道,其中专控,局部變量表存放了編譯期可知的基本數(shù)據(jù)類型(boolean抹凳、byte、char伦腐、short赢底、int、float柏蘑、long幸冻、double)、對(duì)象引用(reference類型)和returnAddress類型咳焚。
????在虛擬機(jī)規(guī)范中嘁扼,對(duì)這個(gè)區(qū)域規(guī)定了兩種異常情況:
????1、StackOverflowError異常黔攒,線程請(qǐng)求的棧深度大于虛擬機(jī)所允許的深度趁啸;
????2、OutOfMemoryError異常督惰,虛擬機(jī)棧擴(kuò)展時(shí)無法申請(qǐng)到足夠的內(nèi)存不傅;

本地方法棧

????本地方法棧(Native Method Stack)與虛擬機(jī)棧發(fā)揮的作用非常相似,它們之間的區(qū)別不過是虛擬機(jī)棧為虛擬機(jī)執(zhí)行Java方法(也就是字節(jié)碼)服務(wù)赏胚,而本地方法棧則為虛擬機(jī)使用到的Native方法服務(wù)访娶。
????與虛擬機(jī)棧一樣,本地方法棧區(qū)域也會(huì)拋出StackOverflowError和OutOfMemoryError異常觉阅。

Java堆

????Java堆(Java Heap)是虛擬機(jī)所管理的內(nèi)存中最大的一塊崖疤。Java堆被所有線程共享,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建典勇。根據(jù)Java虛擬機(jī)規(guī)范規(guī)定劫哼,Java堆可以處于物理上不連續(xù)的內(nèi)存空間中,只要邏輯上連續(xù)即可割笙,就像磁盤空間一樣权烧。
????所有的對(duì)象實(shí)例以及數(shù)組都要在堆上分配(但隨著JIT編譯器的發(fā)展與逃逸分析技術(shù)的逐漸成熟眯亦,棧上分配、標(biāo)量替換優(yōu)化技術(shù)般码,所有對(duì)象都分配在堆上也逐漸變得不是那么“絕對(duì)”了)妻率。
????Java堆是垃圾收集器管理的主要區(qū)域,因此很多時(shí)候也被稱為“GC堆”(Garbage Collected Heap板祝,慶幸沒有被翻譯成“垃圾堆”)宫静。從內(nèi)存回收的角度來看,Java堆還可以細(xì)分為:新生代和老年代券时;再細(xì)致一點(diǎn)的有:Eden空間囊嘉、From Survivor空間、To Survivor空間等革为。
????當(dāng)堆中沒有內(nèi)存完成實(shí)例分配扭粱,且堆也無法再擴(kuò)展時(shí),將會(huì)拋出OutOfMemoryError異常震檩。

方法區(qū)

????方法區(qū)(Method Area)與Java堆一樣琢蛤,是各個(gè)線程共享的內(nèi)存區(qū)域,它用于存儲(chǔ)已被虛擬機(jī)加載的類信息抛虏、常量博其、靜態(tài)變量、即使編譯器編譯后的代碼等數(shù)據(jù)迂猴。
????Java虛擬機(jī)規(guī)范對(duì)方法區(qū)的限制非常寬松慕淡,除了和Java堆一樣不需要連續(xù)的內(nèi)存和可以選擇固定大小或者可擴(kuò)展外,還可以選擇不實(shí)現(xiàn)垃圾收集沸毁。
????根據(jù)Java虛擬機(jī)規(guī)范的規(guī)定峰髓,當(dāng)方法區(qū)無法滿足內(nèi)存分配需求時(shí),將拋出OutOfMemoryError異常息尺。
????以上五大塊是常見的Java虛擬機(jī)內(nèi)存區(qū)域携兵,熟悉掌握以上五大塊內(nèi)存的劃分,我們足以應(yīng)對(duì)各類面試了搂誉,但Java虛擬機(jī)并不僅有著五大塊徐紧;接下來要介紹的兩個(gè)也可以適當(dāng)了解一下。

運(yùn)行時(shí)常量池

????運(yùn)行時(shí)常量池(Runtime Constant Pool)是方法區(qū)的一部分炭懊。Class文件中除了有類的版本并级、字段、方法侮腹、接口等描述信息外嘲碧,還有一項(xiàng)信息是常量池(Constant Pool Table),用于存放編譯期生成的各種字面量和符號(hào)引用凯旋。
????運(yùn)行時(shí)常量池相對(duì)于Class文件常量池的另外一個(gè)重要特征是具備動(dòng)態(tài)性呀潭,Java語言并不要求常量一定只有編譯期才能產(chǎn)生钉迷,運(yùn)行期間也可能將新的常量放入池中至非,比如String類和intern()方法钠署。
????運(yùn)行常量池是方法區(qū)的一部分,自然會(huì)受到方法區(qū)內(nèi)存的限制荒椭,當(dāng)常量池?zé)o法再申請(qǐng)內(nèi)存時(shí)會(huì)拋出OutOfMemoryError異常谐鼎。

直接內(nèi)存

????直接內(nèi)存(Direct Memory)并不是虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)的一部分,也不是Java虛擬機(jī)規(guī)范中定義的內(nèi)存區(qū)域趣惠。在JDK1.4中新加入的NIO(New Input/Output)類狸棍,引入了一種基于通道(Channel)與緩沖區(qū)(Buffer)的I/O方式,它可以使用Native函數(shù)庫直接分配堆外內(nèi)存味悄,然后通過一個(gè)存儲(chǔ)在Java堆中的DirectButeBuffer對(duì)象作為這塊內(nèi)存的引用進(jìn)行操作草戈。
????顯然本機(jī)直接內(nèi)存分配不會(huì)受到Java堆大小的限制,但是既然是內(nèi)存侍瑟,肯定會(huì)受到本機(jī)總內(nèi)存大小以及處理器尋址空間的限制唐片。
????當(dāng)各個(gè)內(nèi)存區(qū)域總和大于物理內(nèi)存限制,無法動(dòng)態(tài)擴(kuò)展時(shí)會(huì)出現(xiàn)OutOfMemoryError異常涨颜。

總結(jié)

????程序計(jì)數(shù)器费韭、虛擬機(jī)棧、本地方法棧庭瑰、堆和方法區(qū)星持,這五大塊是面試中虛擬機(jī)內(nèi)存區(qū)域的常見問題;而對(duì)于深入了解虛擬機(jī)內(nèi)存弹灭,我們還需要知道運(yùn)行是常量池和直接內(nèi)存督暂;尤其是遇到OutOfMemoryError異常,卻無法定位問題時(shí)穷吮,我們應(yīng)該考慮直接內(nèi)存的占用是否超出了物理內(nèi)存限制损痰。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市酒来,隨后出現(xiàn)的幾起案子卢未,更是在濱河造成了極大的恐慌,老刑警劉巖堰汉,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辽社,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡翘鸭,警方通過查閱死者的電腦和手機(jī)滴铅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來就乓,“玉大人汉匙,你說我怎么就攤上這事拱烁。” “怎么了噩翠?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵戏自,是天一觀的道長。 經(jīng)常有香客問我伤锚,道長擅笔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任屯援,我火速辦了婚禮猛们,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘狞洋。我一直安慰自己弯淘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布吉懊。 她就那樣靜靜地躺著庐橙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惕它。 梳的紋絲不亂的頭發(fā)上怕午,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音淹魄,去河邊找鬼郁惜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛甲锡,可吹牛的內(nèi)容都是我干的兆蕉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼缤沦,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼虎韵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缸废,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤包蓝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后企量,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體测萎,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年届巩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了硅瞧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡恕汇,死狀恐怖腕唧,靈堂內(nèi)的尸體忽然破棺而出或辖,到底是詐尸還是另有隱情,我是刑警寧澤枣接,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布颂暇,位于F島的核電站,受9級(jí)特大地震影響月腋,放射性物質(zhì)發(fā)生泄漏蟀架。R本人自食惡果不足惜瓣赂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一榆骚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧煌集,春花似錦妓肢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至卷拘,卻和暖如春喊废,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背栗弟。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國打工污筷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乍赫。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓瓣蛀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親雷厂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子惋增,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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

  • 運(yùn)行時(shí)數(shù)據(jù)區(qū)域 程序計(jì)數(shù)器(Program Counter Register) 程序計(jì)數(shù)器是一塊很小的內(nèi)存空間,它...
    那些年未曾努力過閱讀 341評(píng)論 0 0
  • 版權(quán)聲明:本文為斑馬君學(xué)習(xí)總結(jié)文章改鲫,轉(zhuǎn)載請(qǐng)注明出處诈皿! 一、jdk像棘、jre稽亏、jvm之間的關(guān)系 從廣義上講,運(yùn)行于ja...
    ZebraWei閱讀 542評(píng)論 2 7
  • 剛開始買錯(cuò)書讲弄,買了極簡生活措左,當(dāng)看了2/3,才發(fā)覺問題避除,但是也是不錯(cuò)的收獲怎披,通過這本書了解到國外的計(jì)劃都是把細(xì)節(jié)設(shè)置...
    釋動(dòng)運(yùn)動(dòng)健身Fenly閱讀 129評(píng)論 0 0
  • 一夜暴雨外加一上午的暴雨胸嘁,感覺整座城市都要被大雨吞噬。不過五月的天氣本來就是這樣凉逛,雨季性宏,漲水,迎端午状飞。路過江邊毫胜,江...
    Miss牛牛閱讀 187評(píng)論 0 0
  • 如果以減脂、健身為目的诬辈。推薦做“有氧”+“無氧”運(yùn)動(dòng)酵使。 大多數(shù)中低強(qiáng)度,全身性周期運(yùn)動(dòng)都是有氧運(yùn)動(dòng)(慢跑焙糟、游泳口渔、自...
    小寒之糖糖閱讀 257評(píng)論 0 0