串行GC
垃圾收集通過從堆中刪除未引用的對象並為新創建的對象騰出空間來提高 Java 中的內存效率。
Java 虛擬機有八種類型的垃圾收集器。讓我們詳細考慮它們中的每一個。
Serial GC是最簡單的 GC 實現。它適用於在單線程環境中運行的小型應用程序。所有垃圾收集事件都在同一線程上按順序執行。壓縮在每次垃圾收集後執行。
運行收集器會導致“world stop”事件,此時整個應用程序都會暫停。由於整個應用程序在垃圾收集期間被凍結,如果您想盡可能降低延遲,您不應該在現實生活中求助於此。
使用串行垃圾收集器的 JVM 參數是 -XX:+UseSerialGC。
並行GC
並行垃圾收集器專為在多線程或多處理器硬件上運行的具有大中型數據集的應用程序而設計。這是默認的 GC 實現,也稱為吞吐量收集器。
幾個線程注定要在年輕一代中進行小型垃圾回收。唯一的線程忙於老年代的主要垃圾回收。
運行並行 GC 也會導致世界“停止”並且應用程序掛起。此行為更適合需要完成許多任務並且可以接受長時間暫停的多線程環境,例如運行批處理作業時。
使用並行垃圾收集器的 JVM 參數是-XX:+UseParallelGC。
氣相色譜儀
我們也稱為低位平行拾取器。
在這裡,對於小型垃圾收集,涉及多個線程,這是通過與並行收集器中相同的算法發生的。主要的垃圾收集是多線程的,就像舊的並行 GC 一樣,但 CMS 與應用程序進程並發運行以最大限度地減少“世界停止”事件。
因此,CMS 收集器比其他收集器消耗更多的 CPU。如果你有能力分配更多的 CPU 來提高性能,那麼 CMS 比簡單的並行收集器更可取。CMS GC 不會壓縮。
使用並行標記清除垃圾收集器的 JVM 參數是-XX:+UseConcMarkSweepGC。
G1(垃圾優先)GC
G1GC被設想為 CMS 的替代品,並且是為以大堆大小(大於 4 GB)為特徵的多線程應用程序開發的。它像 CMS 一樣並行且具有競爭力,但在引擎蓋下它的工作方式與舊的垃圾收集器截然不同。
儘管 G1 也是按代運行的,但它沒有為年輕一代和老一代提供單獨的空間。相反,每一代都是一組區域,允許靈活地改變年輕一代的大小。
G1 將堆分成一組大小相等的區域(取決於堆的大小)並將它們掃描到多個線程中。程序執行期間的區域可以反複變老和變新。
標記階段完成後,G1 知道哪些區域包含最多的垃圾。如果用戶對最小化停頓感興趣,G1 只能選擇幾個區域。如果暫停時間對用戶不重要,或者暫停時間限制設置的很高,G1 會遍歷更多的區域。
由於G1 GC會識別垃圾最多的區域,並首先對這些區域進行垃圾回收,因此稱為“垃圾優先”。
G1GC中除了Eden、Survivors和Old Memory區域之外,還有另外兩種類型。
- Humongous (Huge) - 適用於大尺寸對象(超過堆大小的 50%)。
- 可用- 未使用或未分配的空間。
使用 G1 垃圾收集器的 JVM 參數是-XX:+UseG1GC。
謝南多亞(Shandara)
Shenandoah是作為 JDK 12 的一部分發布的新 GC。與 G1 相比,Shenandoah 的主要優勢在於大部分垃圾收集週期是與應用程序線程並發完成的。G1 只能在應用掛起時清空堆區,而 Shenandoah 是和應用同時移動對象的。
Shenandoah 幾乎可以在找到空閒內存後立即壓縮活動對象、清理垃圾和釋放 RAM。由於所有這些都是同時發生的,在不暫停應用程序的情況下,Shenandoah 的 CPU 佔用率更高。
中關村
ZGC是另一個作為 JDK 11 的一部分發布並在 JDK 12 中改進的 GC。
它適用於需要速度和低延遲(暫停少於 10 毫秒)和/或使用非常大的堆(幾 TB)的應用程序。
ZGC 的主要目標是低延遲、可擴展性和易用性。為此,它允許 Java 應用程序繼續運行,儘管垃圾收集操作正在進行中。默認情況下,ZGC 釋放未使用的內存並將其返回給操作系統。
因此,ZGC 通過提供極短的停滯時間(通常在 2 毫秒以內),比其他傳統 GC 帶來了顯著改進。
使用 ZGC 垃圾收集器的 JVM 參數是 -XX:+UnlockExperimentalVMOptions -XX:+UseZGC。
GO TO FULL VERSION