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