Java虛擬內(nèi)存模型

image.png

上圖是Java內(nèi)存模型運行時區(qū)域圖。

運行時數(shù)據(jù)區(qū)分:

1.程序計數(shù)器:

  • 由于java是多線程的疟丙,為了能夠線程上下切換后能夠恢復(fù)到正確的折行位置,每條線程都要有一個獨立的程序計數(shù)器舆绎,記錄當(dāng)前線程正在折行的方法的虛擬機指令星立,該區(qū)域沒有OOM發(fā)生胞锰。

2.JAVA虛擬機棧(本地方法棧) - 線程私有的:

  • 生命周期跟線程一樣的灾锯,描述的是JAVA方法執(zhí)行的內(nèi)存模型兢榨,每個方法創(chuàng)建調(diào)用的時候會創(chuàng)建一個棧幀嗅榕,由于存儲局部變量表等信息。當(dāng)進入一個方法吵聪,棧幀需要的內(nèi)存是已經(jīng)確定的凌那。
    會發(fā)生Stackoverflow和oom(因為申請棧幀需要內(nèi)存)

3.JAVA堆:所有線程共享 :

  • 所有對象的實例以及數(shù)組都要在堆上分配內(nèi)存。
    由于收集器基本都是分代收集算法吟逝,所以java堆還可以細分為:新生代帽蝶,老生代,可以處于物理不連續(xù)的存儲空間。

4.方法區(qū):所有線程共享:

  • 存放虛擬機加載的類的信息块攒,常量励稳,靜態(tài)變量等佃乘。

5.運行時常量池:方法區(qū)的一部分,

什么是對象:

  • 對象包括:對象頭驹尼,實例數(shù)據(jù)趣避,對其填充。
  • 對象創(chuàng)建:當(dāng)new時新翎,虛擬機回去檢查常量池中是否有對應(yīng)的類的引用并且是否其被加載程帕,解析和初始化掖桦,對象需要的大小在類被加載后就可以確定了
  • java虛擬機維護一個空閑的列表瘸恼,記錄堆上面那個區(qū)域是可以用的,
    對象分配好內(nèi)存后匣摘,要將對象對應(yīng)的類的實例亏吝,元數(shù)據(jù)岭埠,對象的哈希碼等存放在對象頭。

引用

  • 強引用:用 new 出來的
  • 軟引用:如果第一次發(fā)現(xiàn)內(nèi)存不夠蔚鸥,會將軟引用對象放入二次回收中枫攀,如果還是內(nèi)存不足,那就會拋出異常株茶。
  • 弱引用来涨,下一次GC發(fā)生的時候,就會回收启盛。
  • 虛引用

回收

  • 當(dāng)一個對象不可達時蹦掐,要被回收還要經(jīng)過2次標(biāo)記,第一次發(fā)現(xiàn)沒有對應(yīng)的GcRoots鏈后僵闯,標(biāo)記一次卧抗,如果發(fā)現(xiàn)該對象重寫了對應(yīng)的finalize()方法,那虛擬機會將該對象放在一個F-queue隊列里面標(biāo)記鳖粟,記住社裆,finalize方法是不能做耗時操作。
    當(dāng)F-Queue隊列被finalize線程執(zhí)行時向图,會進行第二次標(biāo)記泳秀,如果這個是finalize方法將該對象重新引用,那么該對象就會被標(biāo)記為不是回收對象榄攀。
    備注:finalize方法只會被虛擬機調(diào)用一次嗜傅。
  1. 回收方法區(qū)(永久代):
    方法區(qū)回收分為:廢棄的常量和無用的類。
  • 判斷一個類是無用的:
    1.內(nèi)存中已經(jīng)沒有該類的任何實例檩赢,
    2.加載該類的ClassLoader已經(jīng)被回收吕嘀。
    3.該類對應(yīng)的Class對象沒有任何引用。
    (永久代也會溢出的,大量使用反射偶房,動態(tài)代理的時候趁曼,要適時卸載類)

2.回收算法

  • 標(biāo)記-清除
  • 重新復(fù)制
  • 標(biāo)記-整理。
目前商用的虛擬機將java堆分為新生代和老生代棕洋,然后再根據(jù)不同的區(qū)域采用不同的回收算法彰阴。
一般對象都是分配在eden(新生代),當(dāng)新生代內(nèi)存不夠時拍冠,會發(fā)生一次minorGC
  • 需要大對象時尿这,會在老生代分配內(nèi)存,大對象庆杜,比如byte[]數(shù)組等
    大對象對于內(nèi)存分配不友好射众。更要避免分配臨時的大對象,因為有可能在內(nèi)存還很多的時候晃财,還要觸發(fā)GC來給大對象分配連續(xù)的內(nèi)存叨橱,
    當(dāng)一個對象經(jīng)過一段時間的回收后還存活,會將其移動到老生代断盛。

以下況會觸發(fā)GC罗洗,使用的算法是mark-sweep。

  • 其中钢猛,Mark階段從根集(Root Set)開始伙菜,遞歸地標(biāo)記出當(dāng)前所有被引用的對象,而Sweep階段負責(zé)回收那些沒有被引用的對象
  • gc是虛擬機啟動的時候創(chuàng)建的一個線程命迈,每次在堆上面成功創(chuàng)建一個對象的時候贩绕,都會檢測當(dāng)前的閑堆大小是否小于等于128k,如果是的話壶愤,就會調(diào)用有關(guān)觸發(fā)GC_CONCURRENT類型的GC淑倾。閑時會等待一定的時間,等待后如果發(fā)現(xiàn)沒有被調(diào)用gc那么它就調(diào)用函數(shù)trimHeaps對Java堆進行裁剪征椒,以便可以將堆上的一些沒有使用到的內(nèi)存交還給內(nèi)核娇哆。。否則的話勃救,就會調(diào)用函數(shù)dvmCollectGarbageInternal進行類型為GC_CONCURRENT的GC碍讨。
  • 當(dāng)應(yīng)用程序調(diào)用System.gc、VMRuntime.gc接口剪芥,或者接收到SIGUSR1信號時垄开,最終會調(diào)用到函數(shù)dvmCollectGarbage琴许。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末税肪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌益兄,老刑警劉巖锻梳,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異净捅,居然都是意外死亡疑枯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進店門蛔六,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荆永,“玉大人,你說我怎么就攤上這事国章【咴浚” “怎么了?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵液兽,是天一觀的道長骂删。 經(jīng)常有香客問我,道長四啰,這世上最難降的妖魔是什么宁玫? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮柑晒,結(jié)果婚禮上欧瘪,老公的妹妹穿的比我還像新娘。我一直安慰自己匙赞,他們只是感情好恋追,可當(dāng)我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著罚屋,像睡著了一般苦囱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脾猛,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天撕彤,我揣著相機與錄音,去河邊找鬼猛拴。 笑死羹铅,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的愉昆。 我是一名探鬼主播职员,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼跛溉!你這毒婦竟也來了焊切?” 一聲冷哼從身側(cè)響起扮授,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎专肪,沒想到半個月后刹勃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡嚎尤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年荔仁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芽死。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡乏梁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出关贵,到底是詐尸還是另有隱情掌呜,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布坪哄,位于F島的核電站质蕉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏翩肌。R本人自食惡果不足惜模暗,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望念祭。 院中可真熱鬧兑宇,春花似錦、人聲如沸粱坤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽站玄。三九已至枚驻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間株旷,已是汗流浹背再登。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留晾剖,地道東北人锉矢。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像齿尽,于是被迫代替她去往敵國和親沽损。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,654評論 2 354

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