【Java】深入理解Java虛擬機(jī)3——垃圾收集算法

其他文章

【Java】深入理解Java虛擬機(jī)1——內(nèi)存區(qū)域以及OOM類型:http://www.reibang.com/p/65c91ba4006e
【Java】深入理解Java虛擬機(jī)2——判斷對(duì)象是否存活和引用:http://www.reibang.com/p/67c24aa93c03
【Java】深入理解Java虛擬機(jī)3——垃圾收集算法:http://www.reibang.com/p/362407886236
【Java】深入理解Java虛擬機(jī)4——內(nèi)存分配與回收策略:http://www.reibang.com/p/e21f5d5c4f42
【Java】深入理解Java虛擬機(jī)5——類的加載過(guò)程:http://www.reibang.com/p/931ef115d48e
【Java】深入理解Java虛擬機(jī)6——類的加載器及雙親委派:http://www.reibang.com/p/2f33eca93a4f

標(biāo)記-清除算法

最基礎(chǔ)的收集算法是“標(biāo)記-清除”(Mark-Sweep)算法仿吞,如同它的名字一樣,算法分為“標(biāo)記”和“清除”兩個(gè)階段:首先標(biāo)記出所有需要回收的對(duì)象捡偏,在標(biāo)記完成后統(tǒng)一回收所有被標(biāo)記的對(duì)象唤冈。它的主要不足有兩個(gè):一個(gè)是效率問(wèn)題,標(biāo)記和清除兩個(gè)過(guò)程的效率都不高银伟;另一個(gè)是空間問(wèn)題你虹,標(biāo)記清除之后會(huì)產(chǎn)生大量不連續(xù)的內(nèi)存碎片,空間碎片太多可能會(huì)導(dǎo)致以后在程序運(yùn)行過(guò)程中需要分配較大對(duì)象時(shí)彤避,無(wú)法找到足夠的連續(xù)內(nèi)存而不得不提前觸發(fā)另一次垃圾收集動(dòng)作傅物。


標(biāo)記-清除算法

復(fù)制算法

為了解決效率問(wèn)題,一種稱為“復(fù)制”(Copying)的收集算法出現(xiàn)了琉预,它將可用內(nèi)存按容量劃分為大小相等的兩塊挟伙,每次只使用其中的一塊。當(dāng)這一塊的內(nèi)存用完了模孩,就將還存活著的對(duì)象復(fù)制到另外一塊上面尖阔,然后再把已使用過(guò)的內(nèi)存空間一次清理掉。這樣使得每次都是對(duì)整個(gè)半?yún)^(qū)進(jìn)行內(nèi)存回收榨咐,內(nèi)存分配時(shí)也就不用考慮內(nèi)存碎片等復(fù)雜情況介却,只要移動(dòng)堆頂指針,按順序分配內(nèi)存即可块茁,實(shí)現(xiàn)簡(jiǎn)單齿坷,運(yùn)行高效。只是這種算法的代價(jià)是將內(nèi)存縮小為了原來(lái)的一半数焊,未免太高了一點(diǎn)永淌。

現(xiàn)在的商業(yè)虛擬機(jī)都采用這種收集算法來(lái)回收新生代,是將內(nèi)存分為一塊較大的Eden空間和兩塊較小的Survivor空間佩耳,每次使用Eden和其中一塊Survivor遂蛀。當(dāng)回收時(shí),將Eden和Survivor中還存活著的對(duì)象一次性地復(fù)制到另外一塊Survivor空間上干厚,最后清理掉Eden和剛才用過(guò)的Survivor空間李滴。


復(fù)制算法

標(biāo)記-整理算法

復(fù)制收集算法在對(duì)象存活率較高時(shí)就要進(jìn)行較多的復(fù)制操作,效率將會(huì)變低蛮瞄。更關(guān)鍵的是所坯,如果不想浪費(fèi)50%的空間,就需要有額外的空間進(jìn)行分配擔(dān)保挂捅,以應(yīng)對(duì)被使用的內(nèi)存中所有對(duì)象都100%存活的極端情況芹助,所以在老年代一般不能直接選用這種算法。
根據(jù)老年代的特點(diǎn),有人提出了另外一種“標(biāo)記-整理”(Mark-Compact)算法状土,標(biāo)記過(guò)程仍然與“標(biāo)記-清除”算法一樣无蜂,但后續(xù)步驟不是直接對(duì)可回收對(duì)象進(jìn)行清理,而是讓所有存活的對(duì)象都向一端移動(dòng)声诸,然后直接清理掉端邊界以外的內(nèi)存


標(biāo)記-整理算法

分代收集算法

當(dāng)前商業(yè)虛擬機(jī)的垃圾收集都采用“分代收集”(Generational Collection)算法酱讶,這種算法并沒(méi)有什么新的思想,只是根據(jù)對(duì)象存活周期的不同將內(nèi)存劃分為幾塊彼乌。一般是把Java堆分為新生代和老年代泻肯,這樣就可以根據(jù)各個(gè)年代的特點(diǎn)采用最適當(dāng)?shù)氖占惴āT谛律形空眨看卫占瘯r(shí)都發(fā)現(xiàn)有大批對(duì)象死去灶挟,只有少量存活,那就選用復(fù)制算法毒租,只需要付出少量存活對(duì)象的復(fù)制成本就可以完成收集稚铣。而老年代中因?yàn)閷?duì)象存活率高、沒(méi)有額外空間對(duì)它進(jìn)行分配擔(dān)保墅垮,就必須使用“標(biāo)記—清理”或者“標(biāo)記—整理”算法來(lái)進(jìn)行回收惕医。具體的如何分代的,有哪些區(qū)域算色,回收策略是什么 抬伺?我會(huì)在后續(xù)的文章中整理。

理解GC日志

33.125:[GC[DefNew:3324K->152K(3712K)灾梦,0.0025925 secs]3324K->152K(11904K)峡钓,0.0031680 secs] 
1 0 0.6 6 7:[Full GC[Tenured:0K->210K(10240K),0.0149142secs]4603K->210K(19456K)若河,
[Perm:2999K->2999K(21248K)]能岩,0.0150007 secs][Times:user=0.01 sys=0.00,real=0.02 secs]

1.最前面的數(shù)字“33.125:”和“100.667:”代表了GC發(fā)生的時(shí)間萧福,這個(gè)數(shù)字的含義是從Java虛擬機(jī)啟動(dòng)以來(lái)經(jīng)過(guò)的秒數(shù)拉鹃。
2.GC日志開(kāi)頭的“[GC”和“[Full GC”說(shuō)明了這次垃圾收集的停頓類型,而不是用來(lái)區(qū)分新生代GC還是老年代GC的统锤。
3.接下來(lái)的“[DefNew”毛俏、“[Tenured”、“[Perm”表示GC發(fā)生的區(qū)域饲窿,這里顯示的區(qū)域名稱與使用的GC收集器是密切相關(guān)的,
4.后面方括號(hào)內(nèi)部的“3324K->152K(3712K)”含義是“GC前該內(nèi)存區(qū)域已使用容量->GC后該內(nèi)存區(qū)域已使用容量(該內(nèi)存區(qū)域總?cè)萘浚被捞恪6诜嚼ㄌ?hào)之外的“3324K->152K(11904K)”表示“GC前Java堆已使用容量->GC后Java堆已使用容量(Java堆總?cè)萘浚薄?br> 5.再往后逾雄,“0.0025925 secs”表示該內(nèi)存區(qū)域GC所占用的時(shí)間,單位是秒。

錯(cuò)誤不足之處或相關(guān)建議歡迎大家評(píng)論指出鸦泳,謝謝银锻!如果覺(jué)得內(nèi)容可以的話麻煩喜歡(?)一下。您的支持是我最大的動(dòng)力做鹰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末击纬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子钾麸,更是在濱河造成了極大的恐慌更振,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饭尝,死亡現(xiàn)場(chǎng)離奇詭異肯腕,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)钥平,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)实撒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人涉瘾,你說(shuō)我怎么就攤上這事知态。” “怎么了立叛?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵负敏,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我囚巴,道長(zhǎng)原在,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任彤叉,我火速辦了婚禮庶柿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘秽浇。我一直安慰自己浮庐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布柬焕。 她就那樣靜靜地躺著审残,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上藐窄,一...
    開(kāi)封第一講書(shū)人閱讀 51,754評(píng)論 1 307
  • 那天琴昆,我揣著相機(jī)與錄音,去河邊找鬼璧坟。 笑死既穆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的雀鹃。 我是一名探鬼主播幻工,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼黎茎!你這毒婦竟也來(lái)了囊颅?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤傅瞻,失蹤者是張志新(化名)和其女友劉穎踢代,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體俭正,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奸鬓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了掸读。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片串远。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖儿惫,靈堂內(nèi)的尸體忽然破棺而出澡罚,到底是詐尸還是另有隱情,我是刑警寧澤肾请,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布留搔,位于F島的核電站,受9級(jí)特大地震影響铛铁,放射性物質(zhì)發(fā)生泄漏隔显。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一饵逐、第九天 我趴在偏房一處隱蔽的房頂上張望括眠。 院中可真熱鬧,春花似錦倍权、人聲如沸掷豺。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)当船。三九已至,卻和暖如春默辨,著一層夾襖步出監(jiān)牢的瞬間德频,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工缩幸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抱婉,地道東北人档叔。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓桌粉,卻偏偏與公主長(zhǎng)得像蒸绩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子铃肯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355