app開(kāi)發(fā)技術(shù)東莞快速優(yōu)化排名
JVM中的CMS(Concurrent Mark Sweep)GC和Full GC(Full Garbage Collection)是兩種不同的垃圾回收算法。
-
CMS GC:CMS GC是一種并發(fā)的垃圾回收算法,它在運(yùn)行期間與應(yīng)用程序線程并發(fā)工作,盡可能減少垃圾回收對(duì)應(yīng)用程序的影響。CMS GC主要分為四個(gè)階段:初始標(biāo)記、并發(fā)標(biāo)記、重新標(biāo)記和并發(fā)清除。它通過(guò)標(biāo)記和清除兩個(gè)過(guò)程來(lái)回收垃圾對(duì)象,其中標(biāo)記階段和應(yīng)用程序線程并發(fā)執(zhí)行,以減少停頓時(shí)間。
-
Full GC:Full GC是一種非并發(fā)的垃圾回收算法,它會(huì)停止應(yīng)用程序的所有線程,對(duì)整個(gè)堆空間進(jìn)行垃圾回收。Full GC的目的是回收整個(gè)堆空間中所有的垃圾對(duì)象,包括年輕代和老年代。Full GC通常在以下情況下發(fā)生:當(dāng)堆空間不足以分配新的對(duì)象時(shí),當(dāng)年輕代無(wú)法容納存活的對(duì)象時(shí),或者當(dāng)老年代的對(duì)象達(dá)到一定的閾值時(shí)。
因此,CMS GC和Full GC的區(qū)別主要在于執(zhí)行方式和影響范圍。
-
執(zhí)行方式:CMS GC是并發(fā)執(zhí)行的,在垃圾回收的過(guò)程中,應(yīng)用程序線程可以繼續(xù)運(yùn)行,減少停頓時(shí)間。而Full GC是非并發(fā)執(zhí)行的,會(huì)停止應(yīng)用程序的所有線程進(jìn)行垃圾回收,會(huì)造成較長(zhǎng)的停頓時(shí)間。
-
影響范圍:CMS GC只對(duì)老年代進(jìn)行垃圾回收,不會(huì)對(duì)年輕代進(jìn)行回收。而Full GC會(huì)同時(shí)回收年輕代和老年代的垃圾對(duì)象。
總的來(lái)說(shuō),CMS GC適用于對(duì)停頓時(shí)間有嚴(yán)格要求的應(yīng)用程序,它能夠減少垃圾回收對(duì)應(yīng)用程序的影響;而Full GC適用于對(duì)吞吐量要求較高的應(yīng)用程序,它能夠徹底回收堆空間中的所有垃圾對(duì)象。
在JVM中,CMS GC和Full GC的發(fā)生順序可以是不確定的,取決于垃圾回收器的配置和堆內(nèi)存的使用情況。一般情況下,CMS GC會(huì)先于Full GC發(fā)生。
CMS GC是一種增量垃圾回收算法,它在運(yùn)行期間與應(yīng)用程序線程并發(fā)工作。當(dāng)老年代空間不足時(shí),CMS GC會(huì)觸發(fā),并嘗試回收老年代中的垃圾對(duì)象。如果CMS GC無(wú)法回收足夠的空間,或者因?yàn)閼?yīng)用程序的負(fù)載過(guò)重導(dǎo)致垃圾回收無(wú)法跟上對(duì)象分配的速度,那么就會(huì)觸發(fā)Full GC。
Full GC是一種停頓式垃圾回收算法,它會(huì)停止應(yīng)用程序的所有線程進(jìn)行垃圾回收。Full GC通常在以下情況下發(fā)生:當(dāng)堆空間不足以分配新的對(duì)象時(shí),當(dāng)年輕代無(wú)法容納存活的對(duì)象時(shí),或者當(dāng)老年代的對(duì)象達(dá)到一定的閾值時(shí)。當(dāng)發(fā)生Full GC時(shí),JVM會(huì)對(duì)整個(gè)堆空間進(jìn)行垃圾回收,包括年輕代和老年代。
需要注意的是,Full GC的發(fā)生通常會(huì)導(dǎo)致較長(zhǎng)的停頓時(shí)間,因?yàn)樗鼤?huì)停止應(yīng)用程序的所有線程進(jìn)行垃圾回收。而CMS GC的發(fā)生是與應(yīng)用程序線程并發(fā)執(zhí)行的,可以減少停頓時(shí)間。因此,盡量減少Full GC的發(fā)生是優(yōu)化垃圾回收性能的一個(gè)重要方向。
在JVM中,Full GC(Full Garbage Collection)并不是單線程的,它通常會(huì)使用多線程來(lái)進(jìn)行垃圾回收操作。
Full GC的垃圾回收過(guò)程通常包括多個(gè)階段,例如標(biāo)記、清除、壓縮等。在這些階段中,JVM會(huì)利用多個(gè)線程來(lái)并行處理不同的任務(wù),以加快垃圾回收的速度。
具體地說(shuō),Full GC通常會(huì)使用多個(gè)線程來(lái)完成以下任務(wù):
-
標(biāo)記階段:使用多個(gè)線程對(duì)堆內(nèi)存中的對(duì)象進(jìn)行標(biāo)記,標(biāo)記出存活的對(duì)象。
-
清除階段:使用多個(gè)線程對(duì)堆內(nèi)存中的垃圾對(duì)象進(jìn)行清除,釋放內(nèi)存空間。
-
壓縮階段:使用多個(gè)線程對(duì)堆內(nèi)存中的對(duì)象進(jìn)行壓縮,以減少空間碎片化。
通過(guò)利用多線程,Full GC能夠并行處理不同的垃圾回收任務(wù),從而提高垃圾回收的效率和速度。這也是為什么Full GC的停頓時(shí)間相對(duì)較長(zhǎng)的原因,因?yàn)樗枰V箲?yīng)用程序的所有線程,同時(shí)利用多線程進(jìn)行垃圾回收操作。
使用ParNew作為Young區(qū)收集器,CMS作為Old區(qū)收集器,并將Serial Old作為CMS出錯(cuò)的后備收集器是一種常見(jiàn)的收集器組合。
ParNew收集器是一個(gè)多線程的新生代收集器,與Serial收集器類似,但可以充分利用多核CPU的優(yōu)勢(shì),提供更高的吞吐量。
CMS(Concurrent Mark Sweep)收集器是一種以最短回收停頓時(shí)間為目標(biāo)的收集器,通過(guò)并發(fā)標(biāo)記和清除的方式來(lái)減少停頓時(shí)間。
Serial Old收集器是一個(gè)單線程的老年代收集器,使用標(biāo)記-整理算法,適用于小型應(yīng)用或者只能使用單線程收集器的場(chǎng)景。
當(dāng)CMS收集器出現(xiàn)問(wèn)題或無(wú)法完成垃圾回收時(shí),會(huì)觸發(fā)一次Full GC操作,此時(shí)會(huì)使用Serial Old作為后備收集器。Serial Old是一個(gè)單線程的收集器,可以保證在Serial Old收集器的單線程環(huán)境下進(jìn)行垃圾回收。
這種組合可以在一定程度上平衡吞吐量和回收停頓時(shí)間的需求。
JVM所采用的Old區(qū)垃圾收集器為CMS,CMS會(huì)在以下幾種情況下發(fā)生Full GC:
- 大對(duì)象分配到老年代時(shí),可用空間不足
- perm或metaspace空間不足 (JDK 8 開(kāi)始HotSpot取消了perm,將類信息存放在metaspace中)
- 晉升失敗:年輕代的存活對(duì)象,需要遷移到老年代時(shí),老年代剩余對(duì)象不足
- promotion failed:擔(dān)保失敗,,gc日志會(huì)記錄信息(如:[ParNew (promotion failed): 1669947K->145784K(1887488K));
- concurrent mode failure:執(zhí)行CMS GC的過(guò)程中同時(shí)業(yè)務(wù)線程將對(duì)象放入老年代,而此時(shí)老年代空間不足,或者在做Minor GC的時(shí)候,新生代Survivor空間放不下,需要放入老年代,而老年代也放不下而產(chǎn)生的,gc日志會(huì)記錄信息(如:(concurrent mode failure): 2902473K->1221894K(3354624K), 0.3778980 secs] )