jvm結(jié)構(gòu)總結(jié)
?
常見的垃圾回收器有哪些?
?
?
CMS(Concurrent Mark Sweep)
整堆收集器: G1
由于整個(gè)過程中耗時(shí)最長(zhǎng)的并發(fā)標(biāo)記和并發(fā)清除過程中,收集器線程都可以與用戶線程一起工作,所以總體上來說,CMS收集器的內(nèi)存回收過程是與用戶線程一起并發(fā)地執(zhí)行。老年代收集器(新生代使用ParNew)
參數(shù)控制:
-XX:+UseConcMarkSweepGC 使用CMS收集器
-XX:+ UseCMSCompactAtFullCollection Full GC后,進(jìn)行一次碎片整理;整理過程是獨(dú)占的,會(huì)引起停頓時(shí)間變長(zhǎng)
-XX:+CMSFullGCsBeforeCompaction 設(shè)置進(jìn)行幾次Full GC后,進(jìn)行一次碎片整理
-XX:ParallelCMSThreads 設(shè)定CMS的線程數(shù)量(一般情況約等于可用CPU數(shù)量)
cms是一種預(yù)處理垃圾回收器,它不能等到old內(nèi)存用盡時(shí)回收,需要在內(nèi)存用盡前,完成回收操作,否則會(huì)導(dǎo)致并發(fā)回收失敗
??
G1是目前技術(shù)發(fā)展的最前沿成果之一,HotSpot開發(fā)團(tuán)隊(duì)賦予它的使命是未來可以替換掉JDK1.5中發(fā)布的CMS收集器
上面提到的垃圾收集器,收集的范圍都是整個(gè)新生代或者老年代,而G1不再是這樣。使用G1收集器時(shí),Java堆的內(nèi)存布局與其他收集器有很大差別,它將整個(gè)Java堆劃分為多個(gè)大小相等的獨(dú)立區(qū)域(Region),雖然還保留有新生代和老年代的概念,但新生代和老年代不再是物理隔閡了,它們都是一部分(可以不連續(xù))Region的集合。
每個(gè)Region被標(biāo)記了E、S、O和H,說明每個(gè)Region在運(yùn)行時(shí)都充當(dāng)了一種角色,其中H是以往算法中沒有的,它代表Humongous,這表示這些Region存儲(chǔ)的是巨型對(duì)象(humongous object,H-obj),當(dāng)新建對(duì)象大小超過Region大小一半時(shí),直接在新的一個(gè)或多個(gè)連續(xù)Region中分配,并標(biāo)記為H。
為了避免全堆掃描,G1使用了Remembered Set來管理相關(guān)的對(duì)象引用信息。當(dāng)進(jìn)行內(nèi)存回收時(shí),在GC根節(jié)點(diǎn)的枚舉范圍中加入Remembered Set即可保證不對(duì)全堆掃描也不會(huì)有遺漏了。
如果不計(jì)算維護(hù)Remembered Set的操作,G1收集器的運(yùn)作大致可劃分為以下幾個(gè)步驟:
1、初始標(biāo)記(Initial Making)
2、并發(fā)標(biāo)記(Concurrent Marking)
3、最終標(biāo)記(Final Marking)
4、篩選回收(Live Data Counting and Evacuation)
看上去跟CMS收集器的運(yùn)作過程有幾分相似,不過確實(shí)也這樣。初始階段僅僅只是標(biāo)記一下GC Roots能直接關(guān)聯(lián)到的對(duì)象,并且修改TAMS(Next Top Mark Start)的值,讓下一階段用戶程序并發(fā)運(yùn)行時(shí),能在正確可以用的Region中創(chuàng)建新對(duì)象,這個(gè)階段需要停頓線程,但耗時(shí)很短。并發(fā)標(biāo)記階段是從GC Roots開始對(duì)堆中對(duì)象進(jìn)行可達(dá)性分析,找出存活對(duì)象,這一階段耗時(shí)較長(zhǎng)但能與用戶線程并發(fā)運(yùn)行。而最終標(biāo)記階段需要把Remembered Set Logs的數(shù)據(jù)合并到Remembered Set中,這階段需要停頓線程,但可并行執(zhí)行。最后篩選回收階段首先對(duì)各個(gè)Region的回收價(jià)值和成本進(jìn)行排序,根據(jù)用戶所期望的GC停頓時(shí)間來制定回收計(jì)劃,這一過程同樣是需要停頓線程的,但Sun公司透露這個(gè)階段其實(shí)也可以做到并發(fā),但考慮到停頓線程將大幅度提高收集效率,所以選擇停頓。下圖為G1收集器運(yùn)行示意圖:
G1收集器是基于標(biāo)記整理算法實(shí)現(xiàn)的,不會(huì)產(chǎn)生空間碎片,可以精確地控制停頓,將堆劃分為多個(gè)大小固定的獨(dú)立區(qū)域,并跟蹤這些區(qū)域的垃圾堆積程度,在后臺(tái)維護(hù)一個(gè)優(yōu)先列表,每次根據(jù)允許的收集時(shí)間,優(yōu)先回收垃圾最多的區(qū)域(Garbage First)。
?垃圾回收器比較
垃圾回收器選擇策略?
客戶端程序 : Serial + Serial Old;
吞吐率優(yōu)先的服務(wù)端程序(比如:計(jì)算密集型) : Parallel Scavenge + Parallel Old;
響應(yīng)時(shí)間優(yōu)先的服務(wù)端程序 :ParNew + CMS。
?
知識(shí)來源:
【2023年面試】jvm有哪些垃圾回收器,實(shí)際中如何選擇_嗶哩嗶哩_bilibili文章來源:http://www.zghlxwxcb.cn/news/detail-674563.html
JVM學(xué)習(xí)筆記(一)_卷心菜不卷Iris的博客-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-674563.html
到了這里,關(guān)于java八股文面試[JVM]——垃圾回收器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!