這篇文章主要介紹“面試官常問的垃圾回收器有哪些”,在日常操作中,相信很多人在面試官常問的垃圾回收器有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”面試官常問的垃圾回收器有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
創(chuàng)新互聯(lián)服務項目包括桂林網(wǎng)站建設(shè)、桂林網(wǎng)站制作、桂林網(wǎng)頁制作以及桂林網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,桂林網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到桂林省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!
JVM堆內(nèi)存概覽
在聊垃圾回收器之前,我們先來看看JVM堆內(nèi)存的區(qū)域劃分是怎么樣的,看下圖
因為虛擬機使用的垃圾回收算法是分代收集算法,所以堆內(nèi)存被分為了新生代和老年代
新生代使用的垃圾回收算法是復制算法,所以新生代又被分為了 Eden 和Survivor;空間大小比例默認為8:2
Survivor又被分為了S0、S1,這兩個的空間大小比例為1:1
內(nèi)存分配以及垃圾回收
1. 對象優(yōu)先在Eden區(qū)進行分配,如果Eden區(qū)滿了之后會觸發(fā)一次Minor GC
2. Minor GC之后從Eden存活下來的對象將會被移動到S0區(qū)域,當S0內(nèi)存滿了之后又會被觸發(fā)一次Minor GC,S0區(qū)存活下來的對象會被移動到S1區(qū),S0區(qū)空閑;S1滿了之后在Minor GC,存活下來的再次移動到S0區(qū),S1區(qū)空閑,這樣反反復復GC,每GC一次,對象的年齡就漲一歲,默認達到15歲之后就會進入老年代,對于晉身到老年代的年齡閾值可以通過參數(shù) -XX:MaxTenuringThreshold設(shè)置
3. 在Minor GC之后需要的發(fā)送晉身到老年代的對象沒有空間安置,那么就會觸發(fā)Full GC (這步非絕對,視垃圾回收器決定)
Minor GC和Full GC的區(qū)別:Minor GC是指發(fā)生在新生代的垃圾收集行為,由于對象優(yōu)先在Eden區(qū)分配,并且很多對象都是朝生夕死,所以觸發(fā)的頻率相對較高;由于采用的復制算法,所以一般回收速度非???。Full GC是指發(fā)生在老年代的垃圾收集行為,F(xiàn)ull GC的速度一般會比Minor GC慢10倍以上;所以不能讓JVM頻繁的發(fā)生Full GC
為了能夠更好的適應不同程序的內(nèi)存情況,JVM也不一定要求必須達到年齡15歲才能晉身到老年代,如果在Survivor區(qū)中相同年齡的所有對象大小總和大于Survivor區(qū)空間的一半,年齡大于或者等于這個年齡的對象將會直接進入到老年代
Full GC觸發(fā)條件
代碼中調(diào)用System.gc()
老年代空間不足/滿了
持久區(qū)空間不足/滿了
注意:大對象會直接在老年代分配內(nèi)存,可以通過參數(shù)-XX:PretenureSizeThreshold控制對象的大小,通常遇到的大對象是很長的字符串或者數(shù)組,如果分配了一大群大對象只是臨時使用,生命很短暫,那么就會頻繁的發(fā)生Full GC,但是此時的新生代的空間還有空閑;寫代碼的時候,這種情況應該避免,特別是在創(chuàng)建數(shù)組的時候要當心
空間擔保
在新生代發(fā)生Minor GC的時候,JVM會先檢查老年代中可分配的連續(xù)空間是否大于新生代所有對象的總和,如果大于,那么本次Minor GC就可以安全的執(zhí)行;如果不大于,那么JVM會先去檢查參數(shù)HandlePromotionFailure設(shè)置值是否允許空間擔保失敗,如果允許,JVM會繼續(xù)檢查老年代可分配的連續(xù)空間是否大于歷次晉升到老年代對象的平均大小,如果大于,盡管這次Minor GC是有風險的,JVM也會嘗試一次Minor GC;如果不允許擔保失敗,那么JVM直接進行Full GC
雖然擔保有可能會失敗,導致饒一圈才能進行GC,但是還是建議把這個參數(shù)打開,可以避免JVM頻繁的Full GC
垃圾回收器概覽
從上圖可以看出:
新生代可以使用的垃圾回收器:Serial、ParNew、Parallel Scavenge
老年代可以適用的垃圾回收器:CMS、Serial Old、Parallel Old
G1回收器適用于新生代和老年代
相互之間有連線的表示可以配合使用
CMS和Serial Old同為老年代回收器,為何相互會有連線呢?
Serial收集器
這是個單線程收集器,發(fā)展歷史最悠久的收集器,當它在進行垃圾收集工作的時候,其他線程都必須暫停直到垃圾收集結(jié)束(Stop The World)。
雖然Serial收集器存在Stop The World的問題,但是在并行能力較弱的單CPU環(huán)境下往往表現(xiàn)優(yōu)于其他收集器;因為它簡單而高效,沒有多余的線程交互開銷;Serial對于運行在Client模式下的虛擬機來說是個很好的選擇
使用-XX:+UseSerialGC參數(shù)可以設(shè)置新生代使用這個Serial收集器
ParNew收集器
ParNew收集器是Serial收集器的多線程版本;除了使用了多線程進行垃圾收集以外,其他的都和Serial一致;它默認開始的線程數(shù)與CPU的核數(shù)相同,可以通過參數(shù)-XX:ParallelGCThreads來設(shè)置線程數(shù)。
從上面的圖可以看出,能夠與CMS配合使用的收集器,除了Serial以外,就只剩下ParNew,所以ParNew通常是運行在Server模式下的首選新生代垃圾收集器
使用-XX:+UseParNewGC參數(shù)可以設(shè)置新生代使用這個并行回收器
Parallel Scavenge收集器
Parallel Scavenge收集器依然是個采用復制算法的多線程新生代收集器,它與其他的收集器的不同之處在于它主要關(guān)心的是吞吐量,而其他的收集器關(guān)注的是盡可能的減少用戶線程的等待時間(縮短Stop The World的時間)。吞吐量=用戶線程執(zhí)行時間/(用戶線程執(zhí)行時間+垃圾收集時間),虛擬機總共運行100分鐘,其中垃圾收集花費時間1分鐘,那么吞吐量就是 99%
停頓時間越短適合需要和用戶進行交互的程序,良好的響應能夠提升用戶的體驗。而高效的吞吐量可以充分的利用CPU時間,盡快的完成計算任務,所以Parallel Scavenge收集器適用于后臺計算型任務程序。
-XX:MaxGCPauseMillis可以控制垃圾收集的最大暫停時間,需要注意不要以為把這個時間設(shè)置的很小就可以減少垃圾收集暫用的時間,這可能會導致發(fā)生頻繁的GC,反而降低了吞吐量
-XX:GCTimeRatio設(shè)置吞吐量大小,參數(shù)是取值范圍0-100的整數(shù),也就是垃圾收集占用的時間,默認是99,那么垃圾收集占用的最大時間 1%
-XX:+UseAdaptiveSizePolicy 如果打開這個參數(shù),就不需要用戶手動的控制新生代大小,晉升老年代年齡等參數(shù),JVM會開啟GC自適應調(diào)節(jié)策略
Serial Old收集器
Serial Old收集器也是個單線程收集器,適用于老年代,使用的是標記-整理算法,可以配合Serial收集器在Client模式下使用。
它可以作為CMS收集器的后備預案,如果CMS出現(xiàn)Concurrent Mode Failure,則SerialOld將作為后備收集器。(后面CMS詳細說明)
Parallel Old收集器
Parallel Old收集器可以配合Parallel Scavenge收集器一起使用達到“吞吐量優(yōu)先”,它主要是針對老年代的收集器,使用的是標記-整理算法。在注重吞吐量的任務中可以優(yōu)先考慮使用這個組合
-XX:+UseParallelOldGc設(shè)置老年代使用該回收器。
XX:+ParallelGCThreads設(shè)置垃圾收集時的線程數(shù)量。
CMS收集器
CMS收集器是一種以獲取最短回收停頓時間為目標的收集器,在互聯(lián)網(wǎng)網(wǎng)站、B/S架構(gòu)的中常用的收集器就是CMS,因為系統(tǒng)停頓的時間最短,給用戶帶來較好的體驗。
-XX:+UseConcMarkSweepGC設(shè)置老年代使用該回收器。
-XX:ConcGCThreads設(shè)置并發(fā)線程數(shù)量。
CMS采用的是標記-清除算法,主要分為了4個步驟:
初始化標記
并發(fā)標記
重新標記
并發(fā)清除
初始化標記和重新標記這兩個步驟依然會發(fā)生Stop The World,初始化標記只是標記GC Root能夠直接關(guān)聯(lián)到的對象,速度較快,并發(fā)標記能夠和用戶線程并發(fā)執(zhí)行;重新標記是為了修正在并發(fā)標記的過程中用戶線程產(chǎn)生的垃圾,這個時間比初始化標記稍長,比并發(fā)標記短很多。整個過程請看下圖
優(yōu)點
CMS是一款優(yōu)秀的收集器,它的主要優(yōu)點:并發(fā)收集、低停頓,因此CMS收集器也被稱為并發(fā)低停頓收集器(Concurrent Low Pause Collector)。
缺點
CMS收集器對CPU資源非常敏感。 在并發(fā)階段,它雖然不會導致用戶線程停頓,但會因為占用了一部分線程(或者說CPU資源)而導致應用程序變慢,總吞吐量會降低。CMS默認啟動的回收線程數(shù)是(CPU數(shù)量+3)/4,也就是當CPU在4個以上時,并發(fā)回收時垃圾收集線程不少于25%的CPU資源,并且隨著CPU數(shù)量的增加而下降。但是當CPU不足4個時(比如2個),CMS對用戶程序的影響就可能變得很大,如果本來CPU負載就比較大,還要分出一半的運算能力去執(zhí)行收集器線程,就可能導致用戶程序的執(zhí)行速度忽然降低了50%,其實也讓人無法接受。
無法處理浮動垃圾。 由于CMS并發(fā)清理階段用戶線程還在運行著,伴隨程序運行自然就還會有新的垃圾不斷產(chǎn)生。這一部分垃圾出現(xiàn)在標記過程之后,CMS無法再當次收集中處理掉它們,只好留待下一次GC時再清理掉。這一部分垃圾就被稱為“浮動垃圾”。也是由于在垃圾收集階段用戶線程還需要運行,那也就還需要預留有足夠的內(nèi)存空間給用戶線程使用,因此CMS收集器不能像其他收集器那樣等到老年代幾乎完全被填滿了再進行收集,回收閥值可以通過參數(shù)-XX:CMSInitiatingoccupancyFraction來設(shè)置;如果回收閥值設(shè)置的太大,在CMS運行期間如果分配大的對象找不到足夠的空間就會出現(xiàn)“Concurrent Mode Failure”失敗,這時候會臨時啟動SerialOld GC來重新進行老年代的收集,這樣的話停頓的時間就會加長。
標記-清除算法導致的空間碎片 CMS是一款基于“標記-清除”算法實現(xiàn)的收集器,這意味著收集結(jié)束時會有大量空間碎片產(chǎn)生。空間碎片過多時,將會給大對象分配帶來很大麻煩,往往出現(xiàn)老年代空間剩余,但無法找到足夠大連續(xù)空間來分配當前對象。為了解決這個問題CMS提供了一個參數(shù)-XX:+UseCMSCompactAtFullCollecion,如果啟用,在Full GC的時候開啟內(nèi)存碎片整理合并過程,由于內(nèi)存碎片整理的過程無法并行執(zhí)行,所以停頓的時間會加長??紤]到每次FullGC都要進行內(nèi)存碎片合并不是很合適,所以CMS又提供了另一個參數(shù)-XX:CMSFullGCsBeforeCompaction來控制執(zhí)行多少次不帶碎片整理的FullGC之后,來一次帶碎片整理GC
G1收集器
G1是一款面向服務端應用的垃圾回收器。
并行與并發(fā):與CMS類似,充分里用多核CPU的優(yōu)勢,G1仍然可以不暫停用戶線程執(zhí)行垃圾收集工作
分代收集:分代的概念依然在G1保留,當時它不需要和其他垃圾收集器配合使用,可以獨立管理整個堆內(nèi)存
空間的整合:G1整體上采用的是標記-整理算法,從局部(Region)采用的是復制算法,這兩種算法都意味著G1不需要進行內(nèi)存碎片整理
可預測的停頓:能夠讓用戶指定在時間片段內(nèi),消耗在垃圾收集的時間不超過多長時間。
Region
雖然在G1中依然保留了新生代和老年代的概念,但是采用的是一種完全不同的方式來組織堆內(nèi)存,它把整個堆內(nèi)存分割成了很多大小相同的區(qū)域(Region),并且新生代和老年代在物理上也不是連續(xù)的內(nèi)存區(qū)域,請看下圖:
每個Region被標記了E、S、O和H,其中H是以往算法中沒有的,它代表Humongous,這表示這些Region存儲的是巨型對象,當新建對象大小超過Region大小一半時,直接在新的一個或多個連續(xù)Region中分配,并標記為H。Region區(qū)域的內(nèi)存大小可以通過-XX:G1HeapRegionSize參數(shù)指定,大小區(qū)間只能是2的冪次方,如:1M、2M、4M、8M
G1的GC模式
新生代GC:與其他新生代收集器類似,對象優(yōu)先在eden region分配,如果eden region內(nèi)存不足就會觸發(fā)新生代的GC,把存活的對象安置在survivor region,或者晉升到old region
混合GC:當越來越多的對象晉升到了old region,當老年代的內(nèi)存使用率達到某個閾值就會觸發(fā)混合GC,可以通過參數(shù)-XX:InitiatingHeapOccupancyPercent設(shè)置閾值百分比,此參數(shù)與CMS中-XX:CMSInitiatingoccupancyFraction的功能類似;混合GC會回收新生代和部分老年代內(nèi)存,注意是部分老年代而不是全部老年代;G1會跟蹤每個Region中的垃圾回收價值,在用戶指定的垃圾收集時間內(nèi)優(yōu)先回收價值最大的region
Full GC:如果對象內(nèi)存分配速度過快,混合GC還未回收完成,導致老年代被填滿,就會觸發(fā)一次full gc,G1的full gc算法就是單線程執(zhí)行的serial old gc,此過程與CMS類似,會導致異常長時間的暫停時間,盡可能的避免full gc.
到此,關(guān)于“面試官常問的垃圾回收器有哪些”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
當前名稱:面試官常問的垃圾回收器有哪些
本文地址:http://jinyejixie.com/article6/ipjjog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計、網(wǎng)站排名、手機網(wǎng)站建設(shè)、虛擬主機、網(wǎng)站設(shè)計公司、移動網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)