之前說到的垃圾收集算法是內(nèi)存回收的方法論迷帜,那么現(xiàn)在所說的垃圾收集器則是內(nèi)存回收的具體實(shí)現(xiàn)。Java虛擬機(jī)規(guī)范對(duì)于垃圾收集器的實(shí)現(xiàn)沒有任何規(guī)定色洞,因此不同廠商戏锹,不同版本的虛擬機(jī)所提供的垃圾收集器都可能會(huì)有很大差別,并且一般都會(huì)提供參數(shù)供用戶根據(jù)自己的應(yīng)用特點(diǎn)和要求組合各個(gè)年代所使用的收集器。
-
Serial收集器
Serial收集器是最基本火诸、發(fā)展歷史最悠久的收集器锦针,曾經(jīng)是虛擬機(jī)新生代收集的唯一選擇。Serial收集器是一個(gè)單線程的收集器,不僅只會(huì)使用一個(gè)CPU和線程伞插,而且在垃圾收集的時(shí)候會(huì)暫停其他所有的工作線程割粮,直到它收集結(jié)束。這就是所謂的“Stop The World”媚污,在用戶不可見的情況下把用戶正常工作的線程全部停掉舀瓢,這對(duì)很多應(yīng)用來說可能都是難以接受的。但是Serial收集器有著簡(jiǎn)單高效的優(yōu)點(diǎn)耗美,對(duì)于限定單個(gè)CPU的環(huán)境來說京髓,Serial收集器由于沒有線程交互的開銷,專心做垃圾收集自然可以獲得最高的單線程收集效率商架。目前Serial收集器主要運(yùn)行在client模式的Java虛擬機(jī)中堰怨。用于收集新生代的內(nèi)存。
Serial收集器運(yùn)行過程 ParNew收集器
ParNew收集器是Serial收集器的多線程版本蛇摸,除了使用多條線程進(jìn)行垃圾收集之外备图,其余行為包括Serial收集器可用的所有控制參數(shù)、收集算法赶袄、Stop The World揽涮、對(duì)象分配規(guī)則、回收策略都與Serial收集器完全一樣饿肺。
目前ParNew收集器是運(yùn)行在Server模式下虛擬機(jī)的首選新生代垃圾收集器蒋困。
Parallel Scavenge收集器
Parallel Scavenge收集器是一個(gè)新生代收集器,它也是使用復(fù)制算法的收集器敬辣,又是并行的多線程收集器雪标,特點(diǎn)是Parallel Scavenge收集器目標(biāo)是達(dá)到一個(gè)可控制的吞吐量(Throughput),而其他收集器的關(guān)注點(diǎn)則是盡可能的減少垃圾收集時(shí)用戶線程的停頓時(shí)間溉跃。吞吐量就是CPU用戶運(yùn)行用戶代碼的時(shí)間與CPU總消耗時(shí)間的比值村刨,即 吞吐量 = 運(yùn)行用戶代碼時(shí)間 / (運(yùn)行用戶代碼時(shí)間+ 垃圾收集時(shí)間)。停頓時(shí)間越短就越適合需要與用戶交互的程序撰茎,具有良好的響應(yīng)速度嵌牺,能夠提升用戶體驗(yàn);而高吞吐量則可以高效率的利用CPU時(shí)間乾吻,盡快完成程序的運(yùn)算任務(wù)髓梅,主要適合在后臺(tái)運(yùn)算而不太需要交互的任務(wù)。-
Serial Old收集器
Serial Old是Serial收集器的老年代版本绎签,它同樣是一個(gè)單線程收集器枯饿,使用標(biāo)記-整理算法。主要意義還是給Client模式下的虛擬機(jī)使用诡必。
Serial Old收集器工作流程 -
Parallel Old收集器
Parallel Old是Parallel Scavenger收集器老年代版本奢方,使用多線程和標(biāo)記整理算法搔扁。該收集器從JDK 1.6開始提供,再次之前新生代的Parallel Scavenger收集器一直處于比較尷尬的狀態(tài)蟋字。原因是如果新生代是Parallel Scavenger收集器稿蹲,則老年代除了Serial Old之外別無選擇,因?yàn)镻arallel Scavenger收集器和CMS收集器(之后會(huì)介紹該收集器)無法配合工作鹊奖。由于Serial Old在服務(wù)端性能上的“拖累”苛聘,使用了Parallel Scavenger收集器也未必能獲得最大化的吞吐量。單線程的Serial Old收集器無法利用服務(wù)器端多CPU的處理能力忠聚,導(dǎo)致吞吐量不佳设哗。而Parallel Old出現(xiàn)后,就可以和Parallel Scavenger收集器搭配使用两蟀,使用與注重吞吐量以及CPU資源敏感的場(chǎng)合网梢。
Parallel Old收集器