from Dictionary - GC Algorithm
가비지 컬렉션 알고리즘
1. Serial GC
- 서버의 CPU 코어가 1개일 때 사용하기 위해서 개발된 GC
- GC 처리하는 쓰레드가 1개라서
STW가 길다. - MinorGC에서는
Mark-Sweep, MajorGC에서는Mark-Sweep-Compact
java -XX:+UseSerialGC -jar Application.java
2. Parallel GC
- Java 8의 Default
- Serial GC와 기본 알고리즈은 같지만 Young 영역의 Minor GC를 멀티 쓰레드로 수행 (Old는 Single)
- Serial GC에 비해서 STW가 줄어
java -XX:+UseParallelGC -jar Application.java
# -XX:ParallelGCThreads=N : 사용할 쓰레드의 갯수
3. Parallel Old GC(Parallel Compacting Collector)
- Parallel GC를 개선한 버전
- Young, Old도 멀티 GC
- 새로운 GC 청소 방식인
Mark-Summary-Compact방식을 이용 (Old도 Multi)
java -XX:+UseParallelOldGC -jar Application.java
# -XX:ParallelGCThreads=N : 사용할 쓰레드의 갯수
4. CMS GC (Concurrent Mark Sweep)
- 어플리케이션 쓰레드와 GC 쓰레드가 동시에 실행되어 STW를 최대한 줄이기 위래서 고안된 GC
- GC 과정이 매우 복잡
- GC 대상을 파악하는 과정이 복잡한 여러 단계로 수행되기 때문에 다른 GC 대비 CPU 사용량이 높다.
- 메모리 파편화 문제
- CMS GC는 Java9부터
deprecated, Java14에는 중지됨
# deprecated in java9 and finally dropped in java14
java -XX:+UseConcMarkSweepGC -jar Application.java
5. G1 GC (Garbage First)
- GMC GC를 대체하기 위해서 Java 7에서 최초로 release
- Java 9+의 디폴트 GC
- 4GB 이상의 Heap, STW이 0.5 이상이될 때 사용 (Heap이 너무 작으면 미사용 권장)
- 기존의 GC에서는 HEAP 영역을 물리적으로 고정된 Young/ Old로 나눴지만 G1은
Region을 도입. Eden, Survivor, Old를 고정이 아닌 동적으로 부여 - Garbage로 가득찬 영역을 빠르게 회수하여 빈 공간을 확보하므로, 결국 GC 빈도가 줄어드는 효과를 얻게 되는 식

java -XX:+UseG1GC -jar Application.java
6. Shenandoah GC
- Java 12에 release
- RedHat에서 개발
- 기존 GMS가 가진 단편과, G1이 가진 pause 이슈를 해결
- 강력한 Concurrency와 가벼운 GC 로직으로 Heap 사이즈에 영향을 받지 않고 일정한 Pause 시간 소요가 특징
java -XX:+UseShenandoahGC -jar Application.java
7. ZGC( Z Garbage Collector )
- Java 15에 release
- 대량의 메모리(8MB ~ 16TB)를 low-latency로 잘 처리하기 위해서 디자인된 GC
- G1의 Region처럼 ZGC는
ZPage라는 영역을 사용하며, G1의 Region은 크기가 고정이지만 ZPage는 2mb 배수로 운영됨 - ZGC가 내세우는 최대 장점은 힙 크기가 증가해도 STW가 절대로 10ms를 넘지 않는다.
java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -jar Application.java