深入理解Java虛擬機-Java內(nèi)存區(qū)域

簡單總結(jié)一下Java虛擬機運行時數(shù)據(jù)區(qū)


1. 程序計數(shù)器

是一塊較小的內(nèi)存空間,它可以看做是當前線程所執(zhí)行的字節(jié)碼的行號指示器精拟;

每條線程都需要有一個獨立的程序計數(shù)器,即“線程私有”;

2. Java虛擬機棧

Java虛擬機棧是線程私有的裕循,生命周期與線程相同;

虛擬機棧描述的是Java方法執(zhí)行的線程內(nèi)存模型:每個方法被執(zhí)行的時候涨颜,Java虛擬機都會同步創(chuàng)建一個棧幀用于存儲局部變量表费韭,操作數(shù)棧,動態(tài)連接庭瑰,方法出口等信息星持。每一個方法被調(diào)用直至執(zhí)行完畢的過程,就對應(yīng)著一個棧幀在虛擬機內(nèi)從入棧到出棧的過程弹灭。

3. 本地方法棧

4. Java堆

Java堆是虛擬機管理內(nèi)存中最大的一塊督暂,是被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機啟動時創(chuàng)建穷吮。

此內(nèi)存區(qū)域的唯一目的就是存放對象實例逻翁。

“幾乎”所有的對象實例都在堆上分配,逃逸分析 標量替換捡鱼。八回。。

Java堆是垃圾收集器管理的內(nèi)存區(qū)域驾诈;

所有線程共享的Java堆中可以劃分出多個線程私有的分配緩沖期(TLAB)缠诅,以提升對象分配的效率;

無論從什么角度乍迄,如何劃分管引,都不會改變Java堆中存儲內(nèi)容的共性,無論是哪個區(qū)域闯两,存儲的只能是對象的實例褥伴,將Java堆細分的目的只是為了更好地回收內(nèi)存,或者更快地分配內(nèi)存漾狼;

Java堆大小設(shè)置 -Xmx 和 -Xms重慢;

5. 方法區(qū)

方法區(qū)與Java堆一樣,是各個線程共享的內(nèi)存區(qū)域逊躁,它用于存儲被虛擬機加載的類型信息伤锚,常量,靜態(tài)變量,即時編譯器編譯后的代碼緩存等數(shù)據(jù)屯援;

《Java虛擬機規(guī)范》對方法區(qū)約束十分寬松猛们,除了和Java堆一樣不需要連續(xù)的內(nèi)存和可以選擇固定大小或者可擴展外,甚至還可以選擇不實現(xiàn)垃圾收集狞洋,這區(qū)域的內(nèi)存回收目標是針對常量池到回收和對類型的卸載弯淘;

6. 運行時常量池

運行時常量區(qū)是方法區(qū)的一部分。

7. 直接內(nèi)存

直接內(nèi)存并不是虛擬機運行時數(shù)據(jù)區(qū)的一部分吉懊,也不是《java虛擬機規(guī)范》中定義的內(nèi)存數(shù)據(jù)庐橙。但是這部分內(nèi)存也被頻繁地使用,而且也可能導致OOM異常出現(xiàn)借嗽。

本機直接內(nèi)存的分配不會受到Java堆大小的限制态鳖,但是,既然是內(nèi)存恶导,則肯定還是會受到本機總內(nèi)存大小以及處理器尋址空間的限制浆竭,一般服務(wù)器管理員配置虛擬機參數(shù)時,會根據(jù)實際內(nèi)存去設(shè)置-Xmx等參數(shù)信息惨寿,但經(jīng)常忽略直接內(nèi)存邦泄,使得各個內(nèi)存區(qū)域總和大于物理限制限制(包括物理的和操作系統(tǒng)級的限制),從而導致動態(tài)擴展時出現(xiàn)OOM異常裂垦。

8. HotSpot虛擬機對象探究

8.1 對象的創(chuàng)建

new 對象是如何創(chuàng)建的呢顺囊?本文討論一下普通Java對象,不包括數(shù)組和Class對象等蕉拢。

首先檢查new指令參數(shù)是否能在在常量池定位到一個類的符號引用特碳,并檢查這個符號引用代表的類是否被加載,解析和初始化過晕换。如果沒有午乓,則先執(zhí)行相應(yīng)的類加載過程。

類加載之后届巩,再分配內(nèi)存硅瞧。

“指針碰撞”:Java內(nèi)存絕對規(guī)整(所有使用過的內(nèi)存放一邊份乒,空閑的內(nèi)存放另一邊)恕汇,中間放著一個指針作為分界點的指示器,那所分配的內(nèi)存就僅僅是把那個指針向空閑空間方向移動一段與內(nèi)存大小相等的距離或辖;

“空閑列表”:內(nèi)存空間不規(guī)整瘾英,使用的內(nèi)存與空閑的內(nèi)存交錯在一起,那虛擬機會維護一個列表颂暇,記錄哪些內(nèi)存是可用的缺谴。

具體使用何種方法,有java堆是否規(guī)整決定耳鸯,而java堆是否規(guī)整則由垃圾收集器的空間壓縮能力決定湿蛔。

因此膀曾,當使用Serial,ParNew等帶壓縮整理過程的收集器時阳啥,采用指針碰撞添谊,簡單高效;

當使用CMS這種基于清除(Sweep)算法的收集時察迟,理論上就只能采用空閑列表了斩狱;

如何解決“指針碰撞”線程不安全的問題?

1. 對分配內(nèi)存的動作進行同步處理--實際上虛擬機是采用CAS配上失敗重試的方法保證更新操作的原子性扎瓶;

2.把內(nèi)存分配的動作按照線程劃分在不同的空間之中進行所踊,即每個線程在Java堆中預(yù)先分配一小塊內(nèi)存,稱為本地線程分配緩沖(TLAB)概荷,只有本地緩沖區(qū)用完了秕岛,分配新的緩沖區(qū)才需要同步鎖定,虛擬機是否使用TLAB乍赫,可以通過-XX:+/-UseTLAB參數(shù)決定瓣蛀;

內(nèi)存分配完,虛擬機將分配的內(nèi)存空間(但不包括對象頭)都初始化為零值(如果使用了TLAB雷厂,這項工作也可以提前至TLAB分配時提前執(zhí)行)惋增;

然后虛擬機對對象進行必要的設(shè)置,這些信息放在對象頭中改鲫;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诈皿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子像棘,更是在濱河造成了極大的恐慌稽亏,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缕题,死亡現(xiàn)場離奇詭異截歉,居然都是意外死亡,警方通過查閱死者的電腦和手機烟零,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門瘪松,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人锨阿,你說我怎么就攤上這事宵睦。” “怎么了墅诡?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵壳嚎,是天一觀的道長。 經(jīng)常有香客問我,道長烟馅,這世上最難降的妖魔是什么说庭? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮郑趁,結(jié)果婚禮上口渔,老公的妹妹穿的比我還像新娘。我一直安慰自己穿撮,他們只是感情好缺脉,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著悦穿,像睡著了一般攻礼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上栗柒,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天礁扮,我揣著相機與錄音,去河邊找鬼瞬沦。 笑死太伊,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的逛钻。 我是一名探鬼主播僚焦,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼曙痘!你這毒婦竟也來了芳悲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤边坤,失蹤者是張志新(化名)和其女友劉穎名扛,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茧痒,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡肮韧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了旺订。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弄企。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖耸峭,靈堂內(nèi)的尸體忽然破棺而出桩蓉,到底是詐尸還是另有隱情淋纲,我是刑警寧澤劳闹,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響本涕,放射性物質(zhì)發(fā)生泄漏业汰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一菩颖、第九天 我趴在偏房一處隱蔽的房頂上張望样漆。 院中可真熱鬧,春花似錦晦闰、人聲如沸放祟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跪妥。三九已至,卻和暖如春声滥,著一層夾襖步出監(jiān)牢的瞬間眉撵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工落塑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纽疟,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓憾赁,卻偏偏與公主長得像污朽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子龙考,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

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