java垃圾收集

轉(zhuǎn)載模狭、引用請標(biāo)明出處
http://www.reibang.com/p/8ec0ee8ca7ee
本文出自zhh_happig的簡書博客新蟆,謝謝

以下內(nèi)容朴摊,是本人學(xué)習(xí)的筆記和工作中的總結(jié),僅供大家參考诱篷,有誤的地方還請指正

一 判定垃圾對象算法

  • 引用計數(shù)法
    • 在對象中添加一個計數(shù)器阔拳,記錄著指向?qū)ο蟮囊玫膫€數(shù)
    • 當(dāng)有新的引用指向這個對象的時崭孤,計數(shù)器+1,當(dāng)指向?qū)ο蟮囊帽恢胣ull時糊肠,計數(shù)器-1
    • 當(dāng)計數(shù)器的值為0辨宠,那么這個對象就是垃圾對象,就會被垃圾回收器回收
    • 缺陷:當(dāng)對象1中有引用指向?qū)ο?货裹,對象2中有引用指向?qū)ο?嗤形,但是再也沒有其他外部引用指向?qū)ο?和對象2,對象1弧圆、對象2是垃圾對象赋兵。通過引用計數(shù)法笔咽,對象1、對象2計數(shù)器都為1霹期,不會被垃圾回收器回收叶组。
    • 不推薦使用
  • 可達(dá)性分析法
    • 該算法的基本思路就是通過GC Roots對象作為起點,從這些節(jié)點開始向下搜索
    • 搜索走過的路徑被稱為引用鏈
    • 當(dāng)一個對象历造,從GC Roots節(jié)點向下搜索甩十,沒有任何一條路徑能夠達(dá)到該對象,那么這個對象就是垃圾對象
    • 可以做為GC Roots的對象包括
      • 虛擬機(jī)棧中引用指向的對象
      • 方法區(qū)中類靜態(tài)屬性所引用的對象
      • 方法區(qū)中常量所引用的對象
      • 本地方法棧中引用的對象

二 垃圾回收算法

  • 標(biāo)記-清除算法
    • 分為標(biāo)記和清楚2步
    • 標(biāo)記:就是通過可達(dá)性分析法將對象標(biāo)記為垃圾對象
    • 清除:將垃圾對象回收
    • 缺點:存在效率問題和空間問題
      • 垃圾對象在堆內(nèi)存中是散亂的吭产,被清除之后枣氧,會導(dǎo)致越來越多不連續(xù)的空間,當(dāng)分配大對象時垮刹,要尋找一片合適的內(nèi)存空間,就會變得困難
      • 如果找不到合適的內(nèi)存空間存放這個大對象张弛,就會觸發(fā)一次GC荒典,影響性能
  • 復(fù)制算法
    • 年輕代的垃圾收集算法,在年輕代對象存活率低吞鸭,復(fù)制算法效率很高
    • 將堆內(nèi)存分成2部分寺董,只在其中一部分中分配內(nèi)存
    • 垃圾回收后,把存活的對象復(fù)制到另一部分內(nèi)存連續(xù)的空間上
    • 就這樣在2個內(nèi)存中循環(huán)復(fù)制刻剥,這樣解決了 標(biāo)記-清除算法 中的效率問題
    • 缺點:由于只在其中一部分中分配內(nèi)存遮咖,存在內(nèi)存浪費(fèi)問題
      • 再將內(nèi)存細(xì)分,即可降低內(nèi)存浪費(fèi)造虏,詳見Eden御吞、Survivor 0 、Survivor 1漓藕、Tenured
  • 標(biāo)記-整理算法
    • 年老代的垃圾收集算法
    • 在年老代對象存活率高陶珠,復(fù)制算法效率低,使用標(biāo)記-整理算法
    • 標(biāo)記過程仍然與“標(biāo)記-清除”算法一樣享钞,
    • 整理:不是直接清除揍诽,而是對內(nèi)存里面的對象進(jìn)行重新整理,讓所有存活的對象都向一端移動栗竖,依次排列暑脆,那么端邊界另一邊的就都是垃圾對象了,直接清理掉
    • 標(biāo)記-整理算法唯一的缺點就是效率也不高狐肢,不僅要標(biāo)記所有存活對象添吗,還要整理所有存活對象的引用地址。從效率上來說处坪,標(biāo)記-整理算法要低于復(fù)制算法根资。
  • 分代收集算法
    • 根據(jù)不同的內(nèi)存區(qū)選擇不同的算法
    • 在年輕代架专,選擇復(fù)制算法
    • 在年老代,選擇標(biāo)記-整理算法

三 垃圾回收器

  • Serial
    • 年輕代垃圾收集器玄帕,采用復(fù)制算法
    • 串行收集器:如果serial要收集垃圾部脚,必須讓程序其他線程停掉,收集完畢裤纹,程序其他線程繼續(xù)執(zhí)行
    • 單線程垃圾收集器:serial單線程收集垃圾
    • 整體效率低
  • Serial Old
    • 它是Serial收集器的年老代版本委刘,與Serial相似,區(qū)別是使用“標(biāo)記-整理”算法
  • Parnew
    • 年輕代垃圾收集器鹰椒,采用復(fù)制算法
    • 串行收集器:如果parnew要收集垃圾锡移,必須讓程序其他線程停掉,收集完畢漆际,程序其他線程繼續(xù)執(zhí)行
    • 多線程垃圾收集器:parnew多線程收集垃圾
  • Parallel scavenge
    • 與parnew類似淆珊,區(qū)別是parallel scavenge能控制吞吐量
    • 吞吐量 = 執(zhí)行用戶代碼的時間 / (執(zhí)行用戶代碼的時間 + 垃圾回收所占用的時間)
      • -xx:MaxGCPauseMillis 垃圾收集器停頓最大時間,就是垃圾收集線程(多線程)收集垃圾的時間奸汇,是不是設(shè)置越小就越好呢施符?假設(shè)設(shè)置100ms,垃圾收集器分配的內(nèi)存可能是1G擂找,設(shè)置為1ms戳吝,垃圾收集器分配的內(nèi)存可能只有10M,因為只有10M這么小的內(nèi)存才能在1ms內(nèi)收集完贯涎,那么10M內(nèi)存顯然太小了听哭,就會造成垃圾頻繁回收。原來100ms回收一次的任務(wù)塘雳,現(xiàn)在如果1ms回收一次陆盘,可能要頻繁回收80次,對比之下性能并沒有多大提升粉捻。所以不是設(shè)置的越小越好礁遣,應(yīng)該更具實際情況設(shè)置一個合理值。
      • -xx:CGTimeRatio 吞吐量大小
    • 適用注重吞吐量的后端服務(wù)
  • Parallel Old
    • 是Parallel Scavenge收集器的年老代版本肩刃,與Parallel Scavenge相似祟霍,但與Parallel Scavenge不同的是,它使用的是“標(biāo)記-整理算法”
    • 使用方式:-XX:+UseParallelOldGC盈包,打開該收集器后沸呐,將使用Parallel Scavenge(年輕代)+Parallel Old(年老代)的組合進(jìn)行GC
  • CMS
    • 年老代、永久代垃圾收集器呢燥,采用標(biāo)記-清除算法
    • 并行收集器:垃圾收集線程可以和程序其他線程并發(fā)執(zhí)行
    • 多線程垃圾收集器:CMS多線程收集垃圾
    • 工作過程
      • 初始標(biāo)記:造成程序其他線程停頓崭添。標(biāo)記垃圾對象
      • 并發(fā)標(biāo)記:與程序線程并發(fā)運(yùn)行。在運(yùn)行期間會發(fā)生對象的引用變更等等情況叛氨,對于這些對象呼渣,都是需要進(jìn)行重新標(biāo)記的棘伴,否則會發(fā)生漏標(biāo)的情況。這個階段因為是并發(fā)的容易導(dǎo)致concurrent mode failure
      • 重新標(biāo)記:會造成程序其他線程停頓屁置。重新標(biāo)記的內(nèi)存范圍是整個堆焊夸,包含young_gen和old_gen。為什么要掃描新生代呢蓝角,因為對于老年代中的對象阱穗,如果被新生代中的對象引用,那么就會被視為存活對象使鹅,即使新生代的對象已經(jīng)不可達(dá)了揪阶。所以需要標(biāo)記young_gen和old_gen。
      • 并發(fā)清理:與程序線程并發(fā)運(yùn)行患朱。并發(fā)清理階段用戶線程還在運(yùn)行著鲁僚,伴隨程序運(yùn)行自然就還會有新的垃圾不斷產(chǎn)生,這一部分垃圾出現(xiàn)在標(biāo)記過程之后裁厅,CMS無法在當(dāng)次收集中處理掉它們蕴茴,只好留待下一次GC時再清理掉。這一部分垃圾就稱為“浮動垃圾”姐直。
      • 并發(fā)重置:與程序線程并發(fā)運(yùn)行。重新設(shè)置CMS算法內(nèi)部的數(shù)據(jù)結(jié)構(gòu)蒋畜,準(zhǔn)備下一個CMS生命周期的使用
    • 優(yōu)點
      • 并發(fā)收集
      • 低停頓:只有初始標(biāo)記和重新標(biāo)記會造成程序其他線程短暫停頓
    • 缺點
      • 占用大量的cpu資源
      • 無法處理浮動垃圾
      • 出現(xiàn)Concurrent Mode Failure
      • CMS收集與應(yīng)用線程會同時增加對堆內(nèi)存的占用声畏,也就是說,CMS必須要在老年代堆內(nèi)存用盡之前完成垃圾回收姻成,否則CMS回收失敗插龄,出現(xiàn)Concurrent Mode Failure;
      • 年老代的剩余空間無法滿足新對象的空間分配科展,也會出現(xiàn)這個錯誤
      • 在出現(xiàn)Concurrent Mode Failure時均牢,將觸發(fā)擔(dān)保機(jī)制,Serial Old收集器將會以STW的方式進(jìn)行一次full gc才睹,從而造成較大停頓時間徘跪,影響性能
  • G1(Garbage First)
    • JDK7增加,成為HotSpot重點發(fā)展的垃圾回收技術(shù)琅攘,被HotSpot團(tuán)隊寄予取代CMS的使命
    • 將會被安排成為JDK9的默認(rèn)垃圾收集器
    • 并行收集器:垃圾收集線程可以和程序其他線程并發(fā)執(zhí)行
    • 多線程垃圾收集器:G1多線程收集垃圾
    • 詳見G1垃圾收集器

四 垃圾回收器作用內(nèi)存區(qū)域以及他們之間的組合關(guān)系

  • 7種不同分代的收集器
    • Serial垮庐、ParNew、Parallel Scavenge坞琴、Serial Old哨查、Parallel Old、CMS剧辐、G1寒亥;
  • 垃圾收集器所屬區(qū)域
    • 年輕代收集器:Serial邮府、ParNew、Parallel Scavenge
    • 年老代收集器:Serial Old溉奕、Parallel Old褂傀、CMS
    • 整堆收集器:G1
  • 兩個收集器間有連線,表明它們可以搭配使用
    • Serial/Serial Old
    • Serial/CMS
    • ParNew/Serial Old
    • ParNew/CMS
    • Parallel Scavenge/Serial Old
    • Parallel Scavenge/Parallel Old
    • G1

以上內(nèi)容腐宋,是本人學(xué)習(xí)的筆記和工作中的總結(jié)紊服,僅供大家參考,有誤的地方還請指正

轉(zhuǎn)載胸竞、引用請標(biāo)明出處
http://www.reibang.com/p/8ec0ee8ca7ee
本文出自zhh_happig的簡書博客欺嗤,謝謝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市卫枝,隨后出現(xiàn)的幾起案子煎饼,更是在濱河造成了極大的恐慌,老刑警劉巖校赤,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吆玖,死亡現(xiàn)場離奇詭異,居然都是意外死亡马篮,警方通過查閱死者的電腦和手機(jī)沾乘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浑测,“玉大人翅阵,你說我怎么就攤上這事∏ㄑ耄” “怎么了掷匠?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長岖圈。 經(jīng)常有香客問我讹语,道長,這世上最難降的妖魔是什么蜂科? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任顽决,我火速辦了婚禮,結(jié)果婚禮上导匣,老公的妹妹穿的比我還像新娘擎值。我一直安慰自己,他們只是感情好逐抑,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布鸠儿。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪进每。 梳的紋絲不亂的頭發(fā)上汹粤,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機(jī)與錄音田晚,去河邊找鬼嘱兼。 笑死,一個胖子當(dāng)著我的面吹牛贤徒,可吹牛的內(nèi)容都是我干的芹壕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼接奈,長吁一口氣:“原來是場噩夢啊……” “哼踢涌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起序宦,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤睁壁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后互捌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體潘明,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年秕噪,在試婚紗的時候發(fā)現(xiàn)自己被綠了钳降。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡腌巾,死狀恐怖牲阁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情壤躲,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布备燃,位于F島的核電站碉克,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏并齐。R本人自食惡果不足惜漏麦,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望况褪。 院中可真熱鬧撕贞,春花似錦、人聲如沸测垛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至号涯,卻和暖如春目胡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背链快。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工誉己, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人域蜗。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓巨双,卻偏偏與公主長得像,于是被迫代替她去往敵國和親霉祸。 傳聞我的和親對象是個殘疾皇子筑累,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

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

  • 1. 首先需要解決的問題:哪些對象已經(jīng)死亡 1.1 引用計數(shù)算法 引用分析算法是這樣的: 給每一個對象添加一個引用...
    陌城小川閱讀 552評論 0 0
  • 概念理解新生代收集器Serial收集器ParNew收集器Parallel Scavenge收集器老年代收集器Ser...
    懶癌正患者閱讀 250評論 0 0
  • 如果說收集算法是內(nèi)存回收的方法論,那么垃圾收集器就是內(nèi)存回收的具體實現(xiàn)脉执。 Java虛擬機(jī)規(guī)范中對垃圾收集器應(yīng)該如何...
    夢工廠閱讀 17,804評論 11 64
  • ?若果說收集算法是內(nèi)存會說的方法論疼阔,那么垃圾收集器就是內(nèi)存回收的具體實現(xiàn)。Java虛擬機(jī)中對垃圾收集器應(yīng)該如何實現(xiàn)...
    SunnyMore閱讀 278評論 0 0
  • 1.概述 在這篇文章中,我主要會講到以下幾個內(nèi)容: (1)“垃圾”主要存在于什么位置巫橄? (2)什么是“垃圾”淘邻? (...
    Ew0828閱讀 392評論 0 1