垃圾收集提高了Java內(nèi)存的效率,因?yàn)樗鼜亩褍?nèi)存中移除了未被引用的對(duì)象,并為新對(duì)象釋放了空間。Java虛擬機(jī)有八種類(lèi)型的垃圾收集器。讓我們?cè)敿?xì)看看每一個(gè)。想學(xué)習(xí)java垃圾收集技術(shù),建議考慮報(bào)名參加Java培訓(xùn),有明確的學(xué)習(xí)路線和全面系統(tǒng)的課程,能獲得較快提升。
串行GC
這是GC最簡(jiǎn)單的實(shí)現(xiàn),是為運(yùn)行在單線程環(huán)境中的小型應(yīng)用程序設(shè)計(jì)的。所有垃圾收集事件都在一個(gè)線程中連續(xù)進(jìn)行。壓縮在每次垃圾收集后執(zhí)行。
當(dāng)它運(yùn)行時(shí),它會(huì)導(dǎo)致“stop the world”事件,整個(gè)應(yīng)用程序都會(huì)暫停。由于整個(gè)應(yīng)用程序在垃圾收集過(guò)程中被凍結(jié),因此在需要低延遲的實(shí)際場(chǎng)景中不建議這樣做。
使用串行垃圾收集器的JVM參數(shù)是-XX:+UseSerialGC。
并行GC
并行收集器適用于在多處理器或多線程硬件上運(yùn)行的中大型數(shù)據(jù)集的應(yīng)用程序。這是JVM中GC的默認(rèn)實(shí)現(xiàn),也稱(chēng)為吞吐量收集器。
在年輕一代中,多線程用于較小的垃圾收集。在老一代中,單個(gè)線程用于主要的垃圾收集。在java培訓(xùn)中,有理論知識(shí)+實(shí)踐項(xiàng)目,雙管齊下,學(xué)以致用,讓你深入淺出地學(xué)習(xí)java。
運(yùn)行并行GC還會(huì)導(dǎo)致“stop the world event”和應(yīng)用程序凍結(jié)。因?yàn)樗m合多線程環(huán)境,所以可以在需要完成大量工作并且可以接受長(zhǎng)時(shí)間暫停的情況下使用,例如運(yùn)行批處理作業(yè)。
使用并行垃圾收集器的JVM參數(shù)是-XX:+UseParallelGC.
并行舊GC
這是自Java 7u4以來(lái)的并行GC的默認(rèn)版本。它與并行GC相同,只是它為年輕一代和老一代使用多線程。
使用并行垃圾收集器的JVM參數(shù)是-XX:+UseParallelOldGC。
CMS(并發(fā)標(biāo)記掃描)GC
這也稱(chēng)為并發(fā)低暫停收集器。多個(gè)線程使用與Parallel相同的算法進(jìn)行次要垃圾收集。主要垃圾收集是多線程的,就像并行舊GC一樣,但CMS與應(yīng)用程序進(jìn)程并行運(yùn)行,以最小化“stop the world”事件。通過(guò)java培訓(xùn),你可以學(xué)習(xí)更多java垃圾收集技巧,以提高java技能。
因此,CMS收集器比其他GC使用更多的CPU。如果你可以為更好的性能分配更多的CPU,那么CMS垃圾收集器比并行收集器是更好的選擇。CMS GC中不執(zhí)行壓縮。
使用并發(fā)標(biāo)記掃描垃圾收集器的JVM參數(shù)是-XX:+UseConcMarkSweepGC。
G1(垃圾優(yōu)先)GC
G1GC旨在取代CMS,并設(shè)計(jì)用于具有大堆大小(大于4GB)的多線程應(yīng)用程序。它與CMS一樣是并行和并發(fā)的,但與老的垃圾收集器相比,它的工作原理完全不同。
雖然G1也是一代的,但它并沒(méi)有為年輕一代和年老一代分開(kāi)的區(qū)域。相反,每一代都是一組區(qū)域,這允許以靈活的方式調(diào)整年輕一代的大小。
它將堆劃分為一組大小相等的區(qū)域(1MB到32MB,取決于堆的大小),并使用多個(gè)線程掃描它們。在程序運(yùn)行期間的任何時(shí)候,區(qū)域可能是舊區(qū)域或新區(qū)域。想要學(xué)習(xí)java更多知識(shí)和技能,可以考慮參加java培訓(xùn),有經(jīng)驗(yàn)豐富的專(zhuān)業(yè)講師指導(dǎo)教學(xué),有緊跟市場(chǎng)需求的實(shí)時(shí)課程,可以讓你快速掌握這門(mén)技術(shù),節(jié)約時(shí)間,少走彎路。
在標(biāo)記階段完成后,G1知道哪些區(qū)域包含最多的垃圾對(duì)象。如果用戶對(duì)最短的暫停時(shí)間感興趣,G1可以選擇只疏散幾個(gè)地區(qū)。如果用戶不擔(dān)心暫停時(shí)間或者已經(jīng)陳述了一個(gè)相當(dāng)大的暫停時(shí)間目標(biāo),G1可能會(huì)選擇包含更多的區(qū)域。
因?yàn)镚1GC會(huì)識(shí)別垃圾最多的區(qū)域,并首先對(duì)該區(qū)域執(zhí)行垃圾收集,所以它被稱(chēng)為垃圾優(yōu)先。
除了Eden、Survivor和Old memory區(qū)域,G1GC中還有兩種類(lèi)型的區(qū)域:
l Humongous—用于大型對(duì)象(大于堆大小的50%)
l Available—未使用或未分配的空間
使用G1垃圾收集器的JVM參數(shù)是-XX:+UseG1GC。
Epsilon垃圾收集器
Epsilon是一個(gè)什么都不做(no-op)的垃圾收集器,作為JDK 11的一部分發(fā)布。它處理內(nèi)存分配,但不實(shí)現(xiàn)任何實(shí)際的內(nèi)存回收機(jī)制。一旦可用的Java堆耗盡,JVM就會(huì)關(guān)閉。想學(xué)習(xí)垃圾收集器技術(shù)的同學(xué),建議參加java培訓(xùn),在專(zhuān)業(yè)老師和系統(tǒng)課程的帶領(lǐng)學(xué)習(xí)下,很快就能掌握了這部分的知識(shí)和技能。
它可以用于對(duì)延遲極其敏感的應(yīng)用程序,在這些應(yīng)用程序中,開(kāi)發(fā)人員確切地知道應(yīng)用程序的內(nèi)存占用,甚至擁有(幾乎)完全無(wú)垃圾的應(yīng)用程序。否則,不鼓勵(lì)在任何其他情況下使用Epsilon GC。
使用Epsilon垃圾收集器的JVM參數(shù)是-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC.
Shenandoah
Shenandoah是作為JDK 12的一部分發(fā)布的一個(gè)新GC。Shenandeah相對(duì)于G1的主要優(yōu)勢(shì)在于,它與應(yīng)用程序線程同時(shí)執(zhí)行更多的垃圾收集循環(huán)工作。G1只能在應(yīng)用程序暫停時(shí)清空其堆區(qū)域,而Shenandoah可以在應(yīng)用程序同時(shí)重新定位對(duì)象。
Shenandoah可以壓縮活動(dòng)對(duì)象,清理垃圾,并在檢測(cè)到空閑內(nèi)存后立即將RAM釋放回操作系統(tǒng)。由于所有這些都是在應(yīng)用程序運(yùn)行時(shí)同時(shí)發(fā)生的,所以Shenandoah更加占用CPU資源。參加java培訓(xùn),可以學(xué)到全方位的java知識(shí)和技能,而且還有實(shí)戰(zhàn)項(xiàng)目操作訓(xùn)練,積累項(xiàng)目經(jīng)驗(yàn),以便快速上崗。
使用Epsilon垃圾收集器的JVM參數(shù)是-XX:+UnlockExperimentalVMOptions-XX:+UseShenandoahGC。
ZGC
ZGC是作為JDK 11的一部分發(fā)布的另一個(gè)GC,并在JDK 12中進(jìn)行了改進(jìn)。它適用于需要低延遲(小于10ms暫停)和/或使用非常大的堆(TB)的應(yīng)用程序。
ZGC的主要目標(biāo)是低延遲、可擴(kuò)展性和易用性。為此,ZGC允許Java應(yīng)用程序在執(zhí)行所有垃圾收集操作時(shí)繼續(xù)運(yùn)行。默認(rèn)情況下,ZGC取消提交未使用的內(nèi)存并將其返回給操作系統(tǒng)。
因此,ZGC通過(guò)提供極低的暫停時(shí)間(通常在2ms內(nèi)),比其他傳統(tǒng)GC帶來(lái)了顯著的改進(jìn)。
使用Epsilon垃圾收集器的JVM參數(shù)是-XX:+UnlockExperimentalVMOptions -XX:+UseZGC。在java培訓(xùn)中,也有關(guān)于內(nèi)存管理和垃圾回收的相關(guān)課程,學(xué)好這些技能和知識(shí),保障程序穩(wěn)定運(yùn)行。
垃圾收集的優(yōu)勢(shì)
Java中的垃圾收集有很多好處。
首先,它使你的代碼變得簡(jiǎn)單。你不必?fù)?dān)心適當(dāng)?shù)膬?nèi)存分配和釋放周期。你只需在代碼中停止使用某個(gè)對(duì)象,它所使用的內(nèi)存就會(huì)在某個(gè)時(shí)候被自動(dòng)回收。
使用沒(méi)有垃圾收集的語(yǔ)言(如C和C++)的程序員必須在他們的代碼中實(shí)現(xiàn)手動(dòng)內(nèi)存管理。
它還使Java內(nèi)存高效,因?yàn)槔占鲝亩褍?nèi)存中移除未引用的對(duì)象。這將釋放堆內(nèi)存來(lái)容納新對(duì)象。
雖然一些程序員認(rèn)為手動(dòng)內(nèi)存管理優(yōu)于垃圾收集,但垃圾收集現(xiàn)在是許多流行編程語(yǔ)言的標(biāo)準(zhǔn)組件。
對(duì)于垃圾收集器對(duì)性能產(chǎn)生負(fù)面影響的場(chǎng)景,Java提供了許多選項(xiàng)來(lái)調(diào)優(yōu)垃圾收集器,以提高其效率。參加java培訓(xùn),在短時(shí)間內(nèi)盡快掌握垃圾收集器的相關(guān)知識(shí),有助于你更好地進(jìn)行開(kāi)發(fā)工作。