Shenandoah와 ZGC는 Java 애플리케이션에 대해 대기 시간이 짧고 효율적인 가비지 수집을 제공하도록 설계된 두 가지 고급 가비지 수집기입니다. 이러한 수집기를 사용하면 다음과 같은 몇 가지 주요 이점을 얻을 수 있습니다.
셰넌도어 GC:
1. 낮은 일시 중지 시간: Shenandoah GC는 대부분의 가비지 수집 작업을 애플리케이션과 동시에 수행하여 일시 중지 시간을 최소화하도록 설계되었습니다. 이렇게 하면 메모리 사용량이 많은 경우에도 애플리케이션이 응답성을 유지하고 제대로 작동할 수 있습니다[1][3].
2. 동시 압축: Shenandoah GC는 동시 압축을 수행합니다. 즉, 애플리케이션이 실행되는 동안 힙을 압축합니다. 이렇게 하면 전체 가비지 수집을 일시 중지할 필요성이 줄어들고 힙이 컴팩트하고 효율적으로 유지됩니다[1][3].
3. 힙 크기와 무관: Shenandoah GC의 일시 중지 시간은 힙 크기와 무관합니다. 즉, 상당한 일시 중지 없이 대규모 힙을 처리할 수 있으므로 대규모 메모리 할당이 필요한 애플리케이션에 적합합니다[1][3].
4. 높은 처리량: Shenandoah GC는 가비지 수집에 소요되는 시간을 최소화하여 높은 처리량을 제공하도록 설계되었습니다. 이렇게 하면 메모리 사용량이 많은 경우에도 애플리케이션이 계속 효율적으로 실행될 수 있습니다[1][3].
ZGC:
1. 낮은 대기 시간: ZGC는 가비지 수집에 소요되는 시간을 최소화하여 매우 짧은 대기 시간을 제공하도록 설계되었습니다. 이는 애플리케이션과 동시에 대부분의 가비지 수집 작업을 수행하고 단일 세대 지역 기반 접근 방식을 사용하여 이를 달성합니다[2].
2. NUMA 인식: ZGC는 NUMA를 인식하도록 설계되었습니다. 즉, 대규모 힙과 여러 CPU 코어를 효율적으로 처리할 수 있습니다. 이렇게 하면 가비지 수집기가 사용 가능한 하드웨어 리소스를 활용할 수 있습니다[2].
3. 높은 처리량: ZGC는 가비지 수집에 소요되는 시간을 최소화하여 높은 처리량을 제공하도록 설계되었습니다. 이렇게 하면 메모리 사용량이 많은 경우에도 애플리케이션이 계속 효율적으로 실행될 수 있습니다[2].
4. 실험적 기능: ZGC는 활성화하려면 특정 명령줄 옵션이 필요한 실험적 기능입니다. 매우 짧은 일시 중지 시간이 필요하고 대규모 메모리 할당을 처리할 수 있는 애플리케이션에 적합합니다[2].
요약하자면, Shenandoah와 ZGC는 모두 Java 애플리케이션에 대해 대기 시간이 짧고 효율적인 가비지 수집을 제공하도록 설계되었습니다. 높은 처리량이 필요하고 대규모 메모리 할당을 처리할 수 있는 애플리케이션에 적합합니다.
인용:[1] https://clojure-goes-fast.com/blog/shenandoah-in-production/
[2] https://developers.redhat.com/articles/2021/11/02/how-choose-best-java-garbage-collector
[3] https://www.reddit.com/r/feedthebeast/comments/r24zg4/upgrade_your_java_to_one_that_has_the_shenandoah/
[4] https://stackoverflow.com/questions/64252590/how-does-clr-gc-compare-to-latest-zgc-and-shenandoah-gc-on-jvm
[5] https://www.uber.com/blog/jvm-tuning-garbage-collection/