JVM內(nèi)存管理—運(yùn)行時內(nèi)存區(qū)域

JVM 有兩種類型的線程:守護(hù)線程肝箱,非守護(hù)線程稀蟋,只有所有非守護(hù)線程都結(jié)束之后退客,JVM才會結(jié)束運(yùn)行,退出档玻。守護(hù)線程如GC茫藏,非守護(hù)線程如main务傲。

操作系統(tǒng)內(nèi)存與JVM內(nèi)存的聯(lián)系與區(qū)別

  1. 操作系統(tǒng)分為,棧由操作系統(tǒng)管理看杭,會有操作系統(tǒng)進(jìn)行自動回收楼雹,堆由用戶進(jìn)行分配使用
  2. JVM內(nèi)存使用的操作系統(tǒng)的堆尖阔,以防JVM分配的內(nèi)存被操作系統(tǒng)回收
  3. JVM本地方法棧指的是操作系統(tǒng)的棧
  4. 操作系統(tǒng)的PC寄存器介却,是計算機(jī)上的存儲硬件,與內(nèi)存條一樣的硬件憔鬼,但是寄存區(qū)位于CPU內(nèi)胃夏,被稱為Cache仰禀,用于加快數(shù)據(jù)訪問速度;內(nèi)存是外掛在CPU的數(shù)據(jù)總線上的
  5. JVM PC寄存器位于操作系統(tǒng)的堆

圖片來源

操作系統(tǒng)與JVM內(nèi)存模型

JVM規(guī)范中的內(nèi)存空間

1- JVM PC寄存器

PC寄存器配合字節(jié)碼解釋器萍诱,選取下一條字節(jié)碼指令來解釋執(zhí)行污呼,線程私有燕酷,每個線程都有一個PC寄存器。為了確保切換線程后能恢復(fù)到原來進(jìn)程正確的執(zhí)行位置饵蒂。如果執(zhí)行的不是Java方法退盯,而是本地方法Native Method泻肯,這個計數(shù)器值為空(Undefined)软免,如果是Java方法則保存的是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令地址焚挠,可以看做是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器蝌衔,會自增取下一條字節(jié)碼指令的地址。這是JVM 規(guī)范的唯一沒有OutMemoryError的內(nèi)存區(qū)域曹锨。

2- Java 虛擬機(jī)棧
  • 當(dāng)啟動一個線程時沛简,JVM就會給這個線程分配一個棧斥废,所以棧的生命周期是和線程一樣的牡肉。
  • Java方法執(zhí)行的內(nèi)存模型:每個Java方法的執(zhí)行都會創(chuàng)建一個棧幀(Stack Frame),方法的調(diào)用到執(zhí)行完畢(正常退出毛俏,或者異常退出)對應(yīng)著一個棧幀的入棧出棧的過程
  • 一個棧幀包括:局部變量表煌寇、操作數(shù)棧、動態(tài)鏈接擦盾、方法出口等迹卢。

棧幀結(jié)構(gòu):

  1. 局部變量表:存放的是編譯期間可知的基本數(shù)據(jù)類型徒仓,和對象的引用掉弛,比如方法的參數(shù)變量,還有方法內(nèi)的局部變量谋作;需要注意的是如果這個方法是普通的方法遵蚜,那么還會有自己的本身對象的一個引用(this奈惑,索引為0)肴甸,如果是靜態(tài)方法沒有這個自身對象的引用。一個單位局部變量空間為32位友扰,64位長度的long和double數(shù)據(jù)類型會占用兩個局部變量空間焕檬。變量通過聲明的順序的索引來進(jìn)行訪問的澳泵,
  2. 操作數(shù)棧(Operand Stack):是一個存儲中間變量結(jié)果的棧結(jié)構(gòu),只能通過入棧和出棧來進(jìn)行訪問击喂。Java虛擬機(jī)指令是主要是通過操作數(shù)棧來獲取操作數(shù)(Operand)的碰辅,而不是寄存器懂昂。
int a  = 100;  
int b = 98;
// iload_0,iload_1,iadd,istore_2
//iload指令是指將局部變量表中一個int變量加載到操作棧中
//iadd指令彈出操作數(shù)棧的兩個變量,進(jìn)行加法運(yùn)算没宾,然后將結(jié)果壓入棧中
//istore指令是指將操作棧一個數(shù)值存儲到局部變量表中
int c = a+b;
操作數(shù)棧
  1. 動態(tài)鏈接(待續(xù))
  2. 方法出口(待續(xù))
  3. 通常程序員所說的指的就是虛擬機(jī)的局部變量表凌彬。
  4. 兩種異常:StackOverflowError(棧空間溢出)循衰,當(dāng)線程請求的棧深度大于虛擬機(jī)所允許的深度铲敛,將會拋出此異常;OutMemoryError(椈岫郏空間拓展內(nèi)存溢出)伐蒋,當(dāng)虛擬機(jī)棧支持動態(tài)拓展時迁酸,如果在擴(kuò)展時無法申請到足夠的內(nèi)存時先鱼,就會拋出此異常。
3- 本地方法棧(Native Method)
  1. 本地方法棧虛擬機(jī)棧的作用是一樣的奸鬓,只是服務(wù)的對象不一樣焙畔,虛擬機(jī)方法棧是為虛擬機(jī)執(zhí)行java方法(字節(jié)碼)服務(wù)的,而本地方法棧是為虛擬機(jī)執(zhí)行Native方法服務(wù)的串远。
  2. Sun HotSpot 直接將本地方法棧虛擬機(jī)棧 合二為一宏多。
  3. 兩種異常:和虛擬機(jī)棧一樣
4- Java堆(Java Heap)
  1. 所有線程共享的內(nèi)存區(qū)域,與虛擬機(jī)同生命周期抑淫。
  2. 主要任務(wù)是存儲對象實例,基本上所有對象實例數(shù)組都在Heap上分配空間姥闪,但是也不這么絕對始苇,因為編譯器優(yōu)化。
  3. Java堆是一塊很大的內(nèi)存區(qū)域筐喳,為了加速GC回收的效率催式,把這個堆有按照不同粒度進(jìn)行細(xì)分
    • 按代劃分 新生代,老年代避归;再細(xì)分為:Eden空間荣月、From Survivor空間、To Survivor 空間梳毙。
    • 從內(nèi)存分配的角度: TLAB(Thread Local Allocation Buffer):線程共享Heap中可以多個線程私有的分配緩存哺窄。
    • GC的主要回收區(qū)域
    • 物理存儲上不一定連續(xù),只要邏輯上連續(xù)即可;堆空間可以拓展(通過-Xmx萌业,-Xms來控制)坷襟。
    • 異常:OutMemoryError 當(dāng)堆中沒有可用內(nèi)存來存儲對象實例
5- 方法區(qū)(Method Area)
  1. 所有線程共享的內(nèi)存區(qū)域,與虛擬機(jī)同生命周期生年。

  2. 存儲已被虛擬機(jī)加載的類信息婴程、常量、靜態(tài)變量抱婉、編譯后的代碼

  3. 按照代劃分档叔,方法區(qū)在HotSpot中被劃分為永久代(Permanent Generation)

  4. 不需要物理連續(xù)的存儲空間,可拓展(通過 -XX:MaxPermSize蒸绩,-XX:MinPermSize)

  5. 永久代并不永久衙四,GC會對常量池的回收,以及類型的卸載侵贵。

  6. 異常:OutMemoryError届搁,當(dāng)方法區(qū)無法滿足內(nèi)存分配時。

  7. 運(yùn)行時常量池(Runtime Constant Pool)

    • 是方法區(qū)的一部分窍育,Class文件中除了有版本卡睦、字段、方法漱抓、接口等描述信息表锻,還會有一項信息是常量池,用于存放編譯期間生成的各種字面量符號引用以及翻譯后的直接引用乞娄,這部分內(nèi)容將在類加載后存放在方法區(qū)的運(yùn)行時常量池中瞬逊。
    • 運(yùn)行時常量池中的常量,不一定來源于一開始加載的Class文件(編譯期間產(chǎn)生常量)仪或,也可以在運(yùn)行時將新的常量放入常量池中确镊,這是運(yùn)行時常量池動態(tài)性的體現(xiàn)。

JVM規(guī)范外的內(nèi)存空間 -- 直接內(nèi)存(Direct Memory)

  1. 不是虛擬機(jī)內(nèi)存模型以及數(shù)據(jù)區(qū)的一部分范删,但是頻繁使用蕾域,特別是NIO中,基于通道(channel)緩沖區(qū)(Buffer)的I/O方式
  2. 通過Native函數(shù)庫直接分配堆外內(nèi)存到旦,能在一些場景下顯著提高性能旨巷,因為避免了在Java堆和Native堆中來回復(fù)制數(shù)據(jù)
  3. 不會受到Java堆的大小影響,主要取決于本機(jī)的內(nèi)存添忘,以及處理器的尋址空間采呐。
  4. OutMemoryError:虛擬機(jī)參數(shù)設(shè)置時,將虛擬機(jī)內(nèi)存設(shè)置超出物理內(nèi)存或者操作系統(tǒng)的限制時搁骑,導(dǎo)致動態(tài)拓展時導(dǎo)致內(nèi)存溢出斧吐。

java7內(nèi)存布局的變化

從JDK7開始永久代的移除工作又固,但永久代仍然存在于JDK7,并沒有完全的移除会通。

  1. 符號引用(Symbols)轉(zhuǎn)移到了native heap(java堆外);
  2. 字面量(interned strings)和類的靜態(tài)變量(class statics)轉(zhuǎn)移到了java heap口予。
  3. Class元數(shù)據(jù)還在方法區(qū)上

java8 元空間

元空間的本質(zhì)和永久代類似,都是對JVM規(guī)范中方法區(qū)的實現(xiàn)涕侈,用于存放Class元數(shù)據(jù)沪停。不過元空間與永久代之間最大的區(qū)別在于:元空間并不在虛擬機(jī)中,而是使用本地內(nèi)存裳涛,這部分內(nèi)存區(qū)域間接被GC管理木张。因此,默認(rèn)情況下端三,元空間的大小僅受本地內(nèi)存限制舷礼,但是實際使用上如果不設(shè)置大小,可能耗盡系統(tǒng)內(nèi)存郊闯。


參考鏈接:
TLAB與PLAB
http://www.reibang.com/p/2343f2c0ecc4
http://www.reibang.com/p/cd85098cca39
NIO-Buffer
http://www.reibang.com/p/fb832bc2cc32
Java 8 元數(shù)據(jù)空間
http://blog.csdn.net/zhushuai1221/article/details/52122880

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妻献,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子团赁,更是在濱河造成了極大的恐慌育拨,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件欢摄,死亡現(xiàn)場離奇詭異熬丧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)怀挠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門析蝴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绿淋,你說我怎么就攤上這事闷畸。” “怎么了吞滞?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵佑菩,是天一觀的道長。 經(jīng)常有香客問我冯吓,道長倘待,這世上最難降的妖魔是什么疮跑? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任组贺,我火速辦了婚禮,結(jié)果婚禮上祖娘,老公的妹妹穿的比我還像新娘失尖。我一直安慰自己啊奄,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布掀潮。 她就那樣靜靜地躺著菇夸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪仪吧。 梳的紋絲不亂的頭發(fā)上庄新,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機(jī)與錄音薯鼠,去河邊找鬼择诈。 笑死,一個胖子當(dāng)著我的面吹牛出皇,可吹牛的內(nèi)容都是我干的羞芍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼郊艘,長吁一口氣:“原來是場噩夢啊……” “哼荷科!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起纱注,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤畏浆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后奈附,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體全度,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年斥滤,在試婚紗的時候發(fā)現(xiàn)自己被綠了将鸵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡佑颇,死狀恐怖顶掉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挑胸,我是刑警寧澤痒筒,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站茬贵,受9級特大地震影響簿透,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜解藻,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一老充、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧螟左,春花似錦啡浊、人聲如沸觅够。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喘先。三九已至,卻和暖如春廷粒,著一層夾襖步出監(jiān)牢的瞬間窘拯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工坝茎, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留树枫,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓景东,卻偏偏與公主長得像砂轻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子斤吐,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

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