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