JVM筆記【1】-- 運行時數(shù)據(jù)區(qū)

[TOC]

(一)java內(nèi)存區(qū)域管理

C/C++每一個new操作都需要自己去delete/free,而java里面有虛擬機自動管理內(nèi)存扇苞,不容易出現(xiàn)內(nèi)存泄漏或者溢出的問題阴幌,但是不容易出現(xiàn)不代表不出現(xiàn),了解虛擬機怎么使用和管理內(nèi)存是十分重要的是绊谭,對程序優(yōu)化或者問題排查有幫助。

運行時區(qū)域主要分為:

  • 線程私有:
    • 程序計數(shù)器:Program Count Register,線程私有汪拥,沒有垃圾回收
    • 虛擬機棧:VM Stack达传,線程私有,沒有垃圾回收
    • 本地方法棧:Native Method Stack,線程私有,沒有垃圾回收
  • 線程共享:
    • 方法區(qū):Method Area宪赶,以HotSpot為例宗弯,JDK1.8后元空間取代方法區(qū),有垃圾回收搂妻。
    • 堆:Heap罕伯,垃圾回收最重要的地方。
image-20201222221827719

1.1 程序計數(shù)器

空間很小叽讳,當(dāng)前線程執(zhí)行的字節(jié)碼的行號指示器(線程獨有追他,指示當(dāng)前執(zhí)行到哪,下一步需要執(zhí)行哪一個字節(jié)碼)岛蚤,分支邑狸,循環(huán),跳轉(zhuǎn)涤妒,異常處理单雾,線程恢復(fù)都需要依賴它。
線程私有:java多線程其實是線程輪流切換并分配處理器執(zhí)行時間的方式實現(xiàn)她紫,一個核一個具體的時間點硅堆,只會執(zhí)行一個線程的指令。線程切換需要保存和恢復(fù)正確的執(zhí)行位置(保護和恢復(fù)現(xiàn)場)贿讹,所以不同的線程需要不同的程序計數(shù)器渐逃。

  • 執(zhí)行java方法時,程序計數(shù)器記錄的是正在執(zhí)行的字節(jié)碼指令地址
  • 執(zhí)行Native方法民褂,程序計數(shù)器為空

唯一一個沒有規(guī)定任何OutOfMemory的區(qū)域茄菊,也沒有GC(垃圾回收)。

1.2 虛擬機棧

線程私有赊堪,生命周期和線程一樣面殖,主要是記錄該線程Java方法執(zhí)行的內(nèi)存模型。虛擬機棧里面放著好多棧幀哭廉。注意虛擬機棧脊僚,對應(yīng)是Java方法,不包括本地方法遵绰。
一個Java方法執(zhí)行會創(chuàng)建一個棧幀辽幌,一個棧幀主要存儲:

  • 局部變量表
  • 操作數(shù)棧
  • 動態(tài)鏈接
  • 方法出口
    每一個方法調(diào)用的時候,就相當(dāng)于將一個棧幀放到虛擬機棧中(入棧)街立,方法執(zhí)行完成的時候舶衬,就是對應(yīng)著將該棧幀從虛擬機棧中彈出(出棧)埠通。

每一個線程有一個自己的虛擬機棧赎离,這樣就不會混起來,如果不是線程獨立的話端辱,會造成調(diào)用混亂梁剔。

大家平時說的java內(nèi)存分為堆和棧虽画,其實就是為了簡便的不太嚴謹?shù)恼f法,他們說的棧一般是指虛擬機棧荣病,或者虛擬機棧里面的局部變量表码撰。

局部變量表一般存放著以下數(shù)據(jù):

  • 基本數(shù)據(jù)類型(boolean,byte,char,short,int,float,long,double
  • 對象引用(reference類型,不一定是對象本身个盆,可能是一個對象起始地址的引用指針脖岛,或者一個代表對象的句柄,或者與對象相關(guān)的位置)
  • returAddress(指向了一條字節(jié)碼指令的地址)

局部變量表內(nèi)存大小編譯期間確定颊亮,運行期間不會變化柴梆。空間衡量我們叫Slot(局部變量空間)终惑。64位的long和double會占用2個Slot绍在,其他的數(shù)據(jù)類型占用1個Slot。

異常:

  • StackOverflowError:線程請求的棧深度大于虛擬機允許的深度
  • OutOfMemoryError:內(nèi)存不足

1.3 本地方法棧

和虛擬機棧類似雹有,對應(yīng)本地方法偿渡,Native,虛擬機規(guī)范允許語言霸奕,使用方式和數(shù)據(jù)結(jié)構(gòu)不同溜宽,有些可能將虛擬機棧和本地方法棧合并。
異常與虛擬機棧一致:

  • StackOverflowError:線程請求的棧深度大于虛擬機允許的深度
  • OutOfMemoryError:內(nèi)存不足

1.4 java堆

堆是內(nèi)存管理最大的一塊质帅,線程共享坑质。

虛擬機規(guī)范中說,所有的對象實例和數(shù)組都要在堆上分配临梗。但是實際上不是所有的對象都在堆上分配涡扼,這個和JIT編譯器的發(fā)展和逃逸分析技術(shù)相關(guān)。Why盟庞?
// TODO
堆的細分:新生代吃沪,老年代,再細分有Eden什猖,F(xiàn)rom survivor票彪,To survivor等。

堆中也有可能有線程私有的區(qū)域不狮,分配緩沖區(qū)降铸。

物理上可以不連續(xù),但是邏輯上是連續(xù)的摇零。

異常:

  • OutOfMemoryError:內(nèi)存不足

1.5 方法區(qū)

名為非堆推掸,但是實際和堆一樣,是線程共享的區(qū)域,主要存貯以下信息:

  • 已被虛擬機加載的類信息
  • 常量
  • 靜態(tài)變量
  • 即時編譯器編譯后的代碼

方法區(qū)不等于永久代谅畅,指示Hotspot虛擬機將GC分代收集拓展到方法區(qū)登渣,也就是用永久代實現(xiàn)了方法區(qū),而其他的虛擬機不一定毡泻,不是固定的胜茧。JDK1.7將永久代的字符串常量移出了。

方法區(qū)回收垃圾的效果不是很好仇味,可以選擇不回收呻顽,虛擬機可以決定,當(dāng)然也可能發(fā)生內(nèi)存泄漏丹墨。
異常:

  • OutOfMemoryError:內(nèi)存分配異常

1.5.1 運行時常量池

運行時常量池時方法區(qū)的一部分芬位,但是不是全部,Class文件主要包括:

  • 類的版本
  • 字段
  • 方法
  • 接口
  • 常量池带到,存放編譯產(chǎn)生的字面量和符號引用昧碉,一般除了描述Class文件的符號引用,還有直接引用也在里面揽惹。是動態(tài)的被饿,運行時可以產(chǎn)生,比如String.intern()方法搪搏。

異常:

  • OutOfMemoryError:內(nèi)存分配異常

(二)直接內(nèi)存

不是虛擬機運行時數(shù)據(jù)區(qū)狭握,也不是規(guī)范規(guī)定的區(qū)域,但是使用頻繁且可能會有OutOfMemoryError:內(nèi)存分配異常出現(xiàn)疯溺。
比如论颅,NIO(1.4)基于Channel與Buffer的I/O,可以用Native函數(shù)直接分配堆外內(nèi)存囱嫩,通過存儲在Java堆中的DirectByteBuffer對象作為引用來操作恃疯,提高性能,不需要Java堆和Native堆都來回復(fù)制數(shù)據(jù)墨闲。

直接內(nèi)存受物理的內(nèi)存今妄,或者處理器尋址空間之類的限制。

本文系JVM學(xué)習(xí)相關(guān)筆記鸳碧,整理來自周志明老師的《深入理解Java虛擬機》盾鳞,無比欽佩,強烈推薦瞻离!

【作者簡介】
秦懷腾仅,公眾號【秦懷雜貨店】作者,技術(shù)之路不在一時套利,山高水長推励,縱使緩慢鹤耍,馳而不息。這個世界希望一切都很快吹艇,更快,但是我希望自己能走好每一步昂拂,寫好每一篇文章受神,期待和你們一起交流。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末格侯,一起剝皮案震驚了整個濱河市鼻听,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌联四,老刑警劉巖撑碴,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異朝墩,居然都是意外死亡醉拓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門收苏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來亿卤,“玉大人,你說我怎么就攤上這事鹿霸∨盼猓” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵懦鼠,是天一觀的道長钻哩。 經(jīng)常有香客問我,道長肛冶,這世上最難降的妖魔是什么街氢? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮睦袖,結(jié)果婚禮上阳仔,老公的妹妹穿的比我還像新娘。我一直安慰自己近范,他們只是感情好延蟹,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布阱飘。 她就那樣靜靜地躺著虱颗,像睡著了一般忘渔。 火紅的嫁衣襯著肌膚如雪缰儿。 梳的紋絲不亂的頭發(fā)上乖阵,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天瞪浸,我揣著相機與錄音,去河邊找鬼钩蚊。 笑死两疚,一個胖子當(dāng)著我的面吹牛含滴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谈况,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼碑韵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了祝闻?” 一聲冷哼從身側(cè)響起联喘,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎叭喜,沒想到半個月后捂蕴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年陨瘩,在試婚紗的時候發(fā)現(xiàn)自己被綠了拾酝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡崇决,死狀恐怖底挫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情建邓,我是刑警寧澤盈厘,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布官边,位于F島的核電站沸手,受9級特大地震影響注簿,放射性物質(zhì)發(fā)生泄漏契吉。R本人自食惡果不足惜诡渴,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一捐晶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧妄辩,春花似錦惑灵、人聲如沸眼耀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至修赞,卻和暖如春婶恼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背割择。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工眷篇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荔泳。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓蕉饼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親玛歌。 傳聞我的和親對象是個殘疾皇子昧港,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

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