在 Java 8 的 Young GC(新生代垃圾回收)場景中,對于 ToC的場景,即需要盡可能減少垃圾回收停頓時間以滿足業務響應要求的場景,以下幾種收集器各有特點,通常 Parnew和 G1 young表現較為出色,下面詳細分析:
1. Parallel Scavenge 收集器
- 特點
- 是 Java 8 中新生代的并行收集器,它主要關注的是達到一個可控制的吞吐量(吞吐量 = 運行用戶代碼時間 /(運行用戶代碼時間 + 垃圾收集時間))。
- 可以通過參數控制最大垃圾收集停頓時間或吞吐量大小,它會根據系統的運行情況動態調整新生代的大小和 Eden、Survivor 區的比例。
- TOC 場景適用性
- 在 TOC 場景下,如果業務對吞吐量要求較高,對停頓時間要求不是特別苛刻,Parallel Scavenge 收集器是一個不錯的選擇。因為它通過并行回收可以在較短時間內完成垃圾回收,提高系統整體的處理效率,但它可能會有相對較長的停頓時間,不太適合對停頓時間極為敏感的場景。
- 示例參數
-XX:+UseParallelGC # 使用 Parallel Scavenge 作為新生代收集器
2. ParNew 收集器
- 特點
- 是 Serial 收集器的多線程版本,也是并行收集器,主要配合老年代的 CMS 收集器使用。
- 它在進行垃圾回收時,會暫停所有用戶線程,使用多個線程并行地對新生代進行垃圾回收。
- TOC 場景適用性
- 如果和 CMS 搭配使用,在一些對停頓時間有一定要求的 TOC 場景中可以發揮作用。因為它和 CMS 能較好地配合,在一定程度上減少垃圾回收的停頓時間。但它本身在進行垃圾回收時還是會有明顯的停頓,對于極致低延遲的 TOC 場景不是最佳選擇。
- 示例參數
-XX:+UseParNewGC # 使用 ParNew 作為新生代收集器
3. G1(Garbage - First)收集器
- 特點
- 是一款面向服務端應用的垃圾收集器,它將整個堆內存劃分為多個大小相等的 Region。它既可以管理新生代,也可以管理老年代。G1 收集器可以預測垃圾回收的停頓時間,并根據這個預測來選擇要回收的 Region,優先回收垃圾最多的 Region。
- 它的運作過程包括初始標記、并發標記、最終標記和篩選回收等階段,其中初始標記和最終標記會有短暫的停頓,并發標記和篩選回收可以和用戶線程并發執行。
- TOC 場景適用性
- 在 TOC 場景下,G1 收集器是一個很好的選擇。它能夠在滿足停頓時間目標的同時,保持較高的吞吐量。對于大內存、多處理器的系統,G1 收集器可以更好地發揮其優勢,通過合理的 Region 管理和垃圾回收策略,有效減少垃圾回收的停頓時間,提高系統的響應性能。
- 示例參數
-XX:+UseG1GC # 使用 G1 收集器
綜上所述,在 Java 8 的 TOC 場景的 Young GC 中,如果對停頓時間要求極高,G1 收集器通常是最佳選擇;如果更注重與老年代的 CMS 配合,ParNew 搭配 CMS 也是不錯的方案;而如果對吞吐量要求較高,對停頓時間要求不是特別嚴格,Parallel Scavenge 收集器可以考慮。