轉(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的簡書博客欺嗤,謝謝