java虛擬機(jī)垃圾收集器
- 作者:新網(wǎng)
- 來源:新網(wǎng)
- 瀏覽:100
- 2018-04-26 15:53:54
對象的存活時(shí)間有長有短,所以對于存活時(shí)間長的對象,可以避免不必要的開銷。這樣我們就把內(nèi)存分成新生代和老年代,下面和小編一起來了解一下吧。
<
div> 對象的存活時(shí)間有長有短,所以對于存活時(shí)間長的對象,可以避免不必要的開銷。這樣我們就把內(nèi)存分成新生代和老年代,下面和小編一起來了解一下吧。
第一階段,串行收集器
Serial收集器
Serial收集器是一個(gè)單線程收集器,并且在JVM收集的過程中,必須暫停其它正在工作的線程,直到它收集結(jié)束。歷史悠久,在JDK 1.3.1之前是新生代收集的唯一選擇。目前僅是JVM運(yùn)行在client模式下的默認(rèn)新生代收集器。(因?yàn)閏lient端資源有限,而它在處理時(shí)停頓時(shí)間可以控制在幾十毫秒以內(nèi))
Serial Old收集器
Serial Old收集器是Serial收集器的老年代版本,也是一個(gè)單線程收集器,使用標(biāo)記整理算法實(shí)現(xiàn)。目前僅是JVM運(yùn)行在client模式下收集老年代使用。
第二階段,并行收集器
ParNew收集器
ParNew收集器是Serial收集器的多線程版本。
Parallel Scavenge收集器
Parallel Scavenge收集器和ParNew收集器類似,也是新生代收集器,使用復(fù)制算法實(shí)現(xiàn)。
Parallel Old收集器
Parallel Old收集器也是老年代收集器,使用標(biāo)記整理算法實(shí)現(xiàn)。
第三階段,CMS收集器(Concurrent Mark Sweep)
CMS收集器是一種以獲取最短回收停頓時(shí)間為目的的收集器,使用標(biāo)記清理算法實(shí)現(xiàn),是一個(gè)針對老年代進(jìn)行回收的GC。
CMS處理4個(gè)階段:
初始標(biāo)記:這個(gè)階段需要暫停所有正在執(zhí)行的線程,官方叫法是STW(Stop The World)。標(biāo)記和GC Roots直接關(guān)聯(lián)的對象,執(zhí)行很快。
并發(fā)標(biāo)記:這個(gè)階段進(jìn)行GC Root Tracing,多線程執(zhí)行,繼續(xù)標(biāo)記可達(dá)到的對象。
并發(fā)預(yù)處理:這個(gè)階段標(biāo)記從新生代晉升的對象,新分配到老年代的對象以及并發(fā)階段被修改的對象。
重新標(biāo)記:暫停所有用戶線程,重新掃描堆中的對象,進(jìn)行可達(dá)性分析,標(biāo)記活著的對象。
并發(fā)清除:用戶線程被重新激活,同時(shí)清理那些無效的對象。
重置:CMS清除內(nèi)部狀態(tài),為下次回收做準(zhǔn)備。
第四階段,G1收集器(Garbage-First)
G1收集器(或者垃圾優(yōu)先收集器)的設(shè)計(jì)初衷是為了盡量縮短處理超大堆(大于4GB)時(shí)產(chǎn)生的停頓。相對于CMS的優(yōu)勢而言是內(nèi)存碎片的產(chǎn)生率大大降低。在G1中,堆被劃分成許多個(gè)連續(xù)的區(qū)域(region)。每個(gè)區(qū)域大小為2的倍數(shù),大小相等,在1M~32M之間。當(dāng)一個(gè)對象
空間大于一個(gè)區(qū)域的50%
G1處理4個(gè)階段:
初始標(biāo)記:這個(gè)階段是SWT的,并且會觸發(fā)一次普通的Mintor GC。
并發(fā)標(biāo)記:這個(gè)階段在整個(gè)堆中進(jìn)行并發(fā)標(biāo)記,若發(fā)現(xiàn)區(qū)域?qū)ο笾械乃袑ο蠖伎杀换厥?,那這個(gè)區(qū)域會立即被回收。如果有不可被回收的對象,會計(jì)算該對象所在區(qū)域的對象活性(對象存活比率)。
重新標(biāo)記:這個(gè)階段是SWT的,標(biāo)記上一階段產(chǎn)生的垃圾。
并發(fā)清理:用戶線程被重新激活,同時(shí)清理那些無效的對象。
G1優(yōu)點(diǎn):
并發(fā):G1能充分利用CPU、多核環(huán)境下的硬件優(yōu)勢,使用多個(gè)CPU(CPU或者CPU核心)來縮短stop-The-World停頓時(shí)間。部分其他收集器原本需要停頓線程執(zhí)行的GC動作,G1收集器仍然可以通過并發(fā)的方式讓程序繼續(xù)執(zhí)行。
分代收集:雖然G1可以不需要其他收集器配合就能獨(dú)立管理整個(gè)GC堆,但是還是保留了分代的概念。它能夠采用不同的方式去處理新創(chuàng)建的對象和已經(jīng)存活了一段時(shí)間,熬過多次GC的舊對象以獲取更好的收集效果。
空間整合:與CMS的“標(biāo)記清理”算法不同,G1從整體來看是基于“標(biāo)記整理”算法實(shí)現(xiàn)的收集器;從局部上來看是基于“復(fù)制”算法實(shí)現(xiàn)的。
可預(yù)測的停頓:這是G1相對于CMS的另一個(gè)大優(yōu)勢,降低停頓時(shí)間是G1和CMS共同的關(guān)注點(diǎn),但G1除了追求低停頓外,還能建立可預(yù)測的停頓時(shí)間模型,能讓使用者明確指定在一個(gè)長度為M毫秒的時(shí)間片段內(nèi)。