java的垃圾回收机制包括:主流回收算法和收集器(jvm的一个主要优化方向)
2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
java的垃圾回收機制是java語言的一大特色,解放了開發(fā)人員對內(nèi)存的復(fù)雜控制,但如果你想要一個高級java開發(fā)人員,還是需要知道其機制,所謂不僅要會用還要知道其原理這樣才能用的更好,在你的項目出現(xiàn)瓶頸時你才有優(yōu)化的思路和方向。
這里再簡單說一下回收算法和收集器的關(guān)系,好多人搞不明白,可以這樣簡單理解,算法是理論,收集器是根據(jù)各自算法理論的實現(xiàn)。
Serial(串行)收集器,這個是jdk1.3.1以前的版本唯一的垃圾收集器。從名字大概可以看出其是單線程,更讓你郁悶的是他還是阻塞的(意味著,它執(zhí)行時會暫停其它工作的線程),但它的單cpu執(zhí)行效率是最高的,因為他沒有多線程并行或者并發(fā)的管理開銷。適用場景:小型應(yīng)用
Parallel(并行)收集器,相比Serial收集器,Parallel最主要的優(yōu)勢在于使用多線程去完成垃圾清理工作,這樣可以充分利用多核的特性,大幅降低gc時間,這里注意一點,它和Serial收集器一樣是執(zhí)行時,會先暫停業(yè)務(wù)線程。適合大吞吐量的應(yīng)用,但對cpu資源比較敏感,需要衡量。適用場景:大型應(yīng)用,科學(xué)計算,大規(guī)模數(shù)據(jù)采集等。
CMS(并發(fā))Concurrent Low Pause Collector收集器,它是一種以獲取最短回收停頓時間為目標(biāo)的收集器。優(yōu)點:并發(fā)收集,低停頓。基于“標(biāo)記-清除”算法。目前很大一部分Java應(yīng)用都集中在互聯(lián)網(wǎng)站或B/S系統(tǒng)的服務(wù)端上,這類應(yīng)用尤其重視服務(wù)的響應(yīng)速度,希望系統(tǒng)停頓時間最短,以給用戶帶來較好的體驗,CMS收集器就非常符合這類應(yīng)用的需求。適應(yīng)場景:服務(wù)器、電信領(lǐng)域等。
?G1垃圾收集器在JDK7 update 4之后對大于4G的堆有了更好的支持,G1是一個針對多處理器大容量內(nèi)存的服務(wù)器端的垃圾收集器,其目標(biāo)是在實現(xiàn)高吞吐量的同時,盡可能的滿足垃圾收集暫停時間的要求。G1在執(zhí)行一些Java堆空間中的全區(qū)域操作
JDK11,新增Epsilon垃圾收集器,Epsilon 垃圾收集器被稱為“no-op”收集器,將處理內(nèi)存分配而不實施任何實際的內(nèi)存回收機制。 Epsilon 的使用案例包括測試性能,內(nèi)存壓力和虛擬機界面。 它也可以用于短期工作。(未確定)
常見的幾種垃圾回收算法:
標(biāo)記-清除算法(Mark-Sweep)
首先標(biāo)記出所有需要回收的對象,在標(biāo)記完成后統(tǒng)一回收掉所有被標(biāo)記的對象。它主要由兩個缺點:一個是效率問題,標(biāo)記和清除過程的效率都不高;另一個是空間問題,標(biāo)記清除之后會產(chǎn)生大量不連續(xù)的內(nèi)存碎片,空間碎片太多可能會導(dǎo)致當(dāng)程序在以后的運行過程中需要分配較大對象時無法找到足夠的連續(xù)內(nèi)存而不得不提前觸發(fā)另一次垃圾收集動作
復(fù)制算法(Copying)(針對新生代)
為了解決標(biāo)記清除算法的效率問題,出現(xiàn)了復(fù)制算法,它將可用內(nèi)存按容量劃分為大小相等的兩塊,每次使用其中的一塊。當(dāng)這塊的內(nèi)存用完了,就將還存活著的對象復(fù)制到另一塊上面,然后再把已使用過的內(nèi)存空間一次清理掉。優(yōu)點是每次都是對其中的一塊進行內(nèi)存回收,內(nèi)存分配時就不用考慮內(nèi)存碎片等復(fù)雜情況,只要移動堆頂指針,按順序分配內(nèi)存即可,實現(xiàn)簡單,運行高效。缺點是將內(nèi)存縮小為原來的一半
標(biāo)記-整理算法(Mark-Compact)(針對老年代)
標(biāo)記過程仍然與“標(biāo)記-清除”算法一樣,但后續(xù)步驟不是直接對可回收對象進行清理,而是讓所有存活的對象都向一端移動,然后直接清理掉端邊界以外的內(nèi)存。是復(fù)制算法的升級。
分代收集算法(Generational Collection)
分代收集算法(Generational Collection)
當(dāng)前商業(yè)虛擬機的垃圾收集都采用“分代收集”算法,這種算法并無新的方法,只是根據(jù)對象的存活周期的不同將內(nèi)存劃分為幾塊,一般是把Java堆分為新生代和老年代,這樣就可以根據(jù)各個年代的特點采用最適當(dāng)?shù)氖占惴āT谛律?#xff0c;每次垃圾收集時都發(fā)現(xiàn)有大批對象死去,只有少量存活,那就選用復(fù)制算法,只需要付出少量存活對象的復(fù)制成本就可以完成收集。而老年代中因為對象存活率高、沒有額外空間對它進行分配擔(dān)保,就必須使用“標(biāo)記-清理”或“標(biāo)記-整理”算法來進行回收。
jdk1.7 默認垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
jdk1.8 默認垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
jdk1.9 默認垃圾收集器G1
?
轉(zhuǎn)載于:https://my.oschina.net/haitaohu/blog/1851822
總結(jié)
以上是生活随笔為你收集整理的java的垃圾回收机制包括:主流回收算法和收集器(jvm的一个主要优化方向)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么总能梦到老公出轨
- 下一篇: @hot热加载修饰器导致static静态