Java虚拟机垃圾收集器初步学习
Java虛擬機(jī)—垃圾收集器
1.概述
如果說收集算法是內(nèi)存回收的方法論,那么垃圾收集器就是內(nèi)存回收的具體實(shí)現(xiàn)。
? ? 這里討論的收集器基于JDK 1.7 Update 14之后的HotSpot虛擬機(jī)(在這個(gè)版本中正式提供了商用的G1收集器,之前G1仍處于實(shí)驗(yàn)狀態(tài))。
1.1 垃圾收集器組合
這個(gè)虛擬機(jī)包含的所有收集器如圖所示:
? ? ?
(A)圖3-5展示了7種作用于不同分代的收集器:
Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1;
(B)虛擬機(jī)所處的區(qū)域,則表示它是屬于新生代收集器還是老年代收集器;
? 新生代收集器:Serial、ParNew、Parallel Scavenge;
? 老年代收集器:Serial Old、Parallel Old、CMS;
? 整堆收集器:G1;
(C)如果兩個(gè)收集器之間存在連線,就說明它們可以搭配使用。
Serial/Serial Old、Serial/CMS、ParNew/Serial Old、ParNew/CMS、Parallel Scavenge/Serial Old、Parallel Scanvenge/Parallel Old、G1;
(D)其中Serial Old作為CMS出現(xiàn)“Concurrent Mode Failure”失敗后的后備預(yù)案。
1.2 Minor GC和Full GC的區(qū)別
Minor GC:又稱新生代GC,指發(fā)生在新生代的垃圾收集動(dòng)作;
Full GC:又稱為Major GC或老年代GC,指發(fā)生在老年代的GC;出現(xiàn)Full GC經(jīng)常會(huì)伴隨至少一次的Minor GC(不是絕對(duì),Parallel Scavenge收集器就可以選擇設(shè)置Major GC策略);
2. 新生代收集器?
2.1 Serial收集器?
Serial 收集器是最基本、發(fā)展歷史最悠久的收集器,曾經(jīng)(在JDK1.3.1之前)是虛擬機(jī)新生代收集的唯一選擇,使用復(fù)制算法。
Serial收集器依然是虛擬機(jī)運(yùn)行在Client模式下的默認(rèn)新生代收集器。
2.2 ParNew收集器?
ParNew(ParNew是parallel new的簡(jiǎn)寫)收集器其實(shí)就是Serial收集器的多線程版本,除了使用多條線程進(jìn)行垃圾收集之外,其余行為包括Serial收集器可用的所有控制參數(shù)(例如:-XX:SurvivorRatio、-XX:PretenureSizeThreshold、-XX:HandlePromotionFailure等)、收集算法、Stop The World、對(duì)象分配規(guī)則、回收策略等都與Serial收集器完全一樣,也同樣使用復(fù)制算法,在實(shí)現(xiàn)上,這兩種收集器也共用了相當(dāng)多的代碼。
2.3 Parallel Scanvenge收集器?
Parallel Scavenge收集器是一個(gè)新生代收集器,它也是使用復(fù)制算法的收集器,又是并行的多線程收集器。
Parallel Scavenge收集器的特點(diǎn)是它的關(guān)注點(diǎn)與其他收集器不同,CMS等收集器的關(guān)注點(diǎn)是盡可能地縮短垃圾收集時(shí)用戶線程的停頓時(shí)間,而Parallel Scavenge收集器的目標(biāo)則是達(dá)到一個(gè)可控制的吞吐量(Throughput)。
Parallel Scavenge收集器提供了兩個(gè)參數(shù)用于精確控制吞吐量,分別是控制最大垃圾收集停頓時(shí)間的 -XX:MaxGCPauseMillis參數(shù)以及直接設(shè)置吞吐量大小的-XX:GCTimeRatio參數(shù)。
3. 老年代收集器
3.1 Serial Old收集器?
Serial Old是Serial收集器的老年代版本,它同樣是一個(gè)單線程收集器,使用“標(biāo)記-整理”算法。這個(gè)收集器的主要意義也是在于給Client模式下的虛擬機(jī)使用。
3.2 Parallel Old收集器?
? Parallel Old是Parallel Scavenge收集器的老年代版本,使用多線程和“標(biāo)記-整理”算法。
直到Parallel Old收集器出現(xiàn)后,“吞吐量?jī)?yōu)先”收集器終于有了比較名副其實(shí)的應(yīng)用組合,在注重吞吐量以及CPU資源敏感的場(chǎng)合,都可以優(yōu)先考慮Parallel Scavenge加Parallel Old收集器。
3.3 CMS收集器?
CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時(shí)間為目標(biāo)的收集器。目前很大一部分的Java應(yīng)用集中在互聯(lián)網(wǎng)站或者B/S系統(tǒng)的服務(wù)端上,這類應(yīng)用尤其重視服務(wù)的響應(yīng)速度,希望系統(tǒng)停頓時(shí)間最短,以給用戶帶來較好的體驗(yàn)。CMS收集器就非常符合這類應(yīng)用的需求。
4. 整堆收集器
4.1 G1收集器
G1(Garbage-First)收集器是當(dāng)今收集器技術(shù)發(fā)展的最前沿成果之一。
G1是一款面向服務(wù)端應(yīng)用的垃圾收集器。HotSpot開發(fā)團(tuán)隊(duì)賦予它的使命是(在比較長(zhǎng)期的)未來可以替換掉JDK 1.5中發(fā)布的CMS收集器。
G1收集器的運(yùn)作大致可劃分為以下幾個(gè)步驟:
初始標(biāo)記(Initial Marking)
并發(fā)標(biāo)記(Concurrent Marking)
最終標(biāo)記(Final Marking)
篩選回收(Live Data Counting and Evacuation)
總結(jié)
以上是生活随笔為你收集整理的Java虚拟机垃圾收集器初步学习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java虚拟机内存模型初步学习
- 下一篇: C++对象内存模型学习