본문 바로가기

JAVA

ZGC 기본 개념 알아보기

728x90
반응형

ZGC (Z Garbage Collector)는 Java Virtual Machine (JVM)에서 사용되는 최신의 가비지 컬렉터 중 하나로, 대규모 애플리케이션에서의 낮은 지연 시간과 높은 처리량을 목표로 설계되었습니다. ZGC는 Java 11에 처음 도입되었으며, 계속해서 개선되고 있습니다. ZGC의 주요 특징과 작동 방식을 상세히 설명드리겠습니다.

ZGC의 주요 특징

  1. 저지연(Garbage Collection Pause Time): ZGC는 가비지 컬렉션으로 인한 지연 시간을 매우 짧게 유지하는 것이 특징입니다. 일반적으로 수 밀리초 이내로 유지되며, 이는 대규모 애플리케이션에서 매우 중요한 성능 요소입니다.
  2. 대규모 힙 지원: ZGC는 테라바이트 단위의 대규모 힙 메모리까지 지원합니다. 이는 대용량 데이터를 처리하는 애플리케이션에서 매우 유용합니다.
  3. 컴팩션 지원: ZGC는 메모리 파편화를 방지하기 위해 메모리 컴팩션을 지원합니다. 컴팩션은 메모리를 재배치하여 더 큰 연속된 메모리 블록을 확보하는 과정입니다.
  4. Concurrent Processing: ZGC는 대부분의 가비지 컬렉션 작업을 애플리케이션 스레드와 동시에 수행합니다. 이는 애플리케이션의 성능 저하를 최소화합니다.
  5. Colored Pointers: ZGC는 colored pointers라는 독특한 기법을 사용하여 객체의 상태를 관리합니다. 이는 가비지 컬렉션의 효율성을 높이고 지연 시간을 줄이는 데 도움을 줍니다.

ZGC의 작동 원리

ZGC는 크게 다음과 같은 단계로 가비지 컬렉션을 수행합니다:

  1. Marking (마킹):
    • Initial Mark (초기 마킹): 애플리케이션 스레드가 실행 중인 동안 루트 객체들을 마킹합니다.
    • Concurrent Mark (동시 마킹): 애플리케이션 스레드와 병렬로 힙 전체를 스캔하여 객체들을 마킹합니다.
    • Remark (재마킹): 최종 마킹 단계로, Concurrent Mark 단계 이후에 변경된 객체들을 다시 마킹합니다.
  2. Relocation (이동):
    • Concurrent Relocate (동시 이동): 애플리케이션 스레드와 병렬로 살아있는 객체들을 새로운 메모리 영역으로 이동합니다.
  3. Cleanup (정리):
    • 사용되지 않는 메모리 블록을 회수하여 새로운 객체가 할당될 수 있도록 합니다.

Colored Pointers

ZGC는 가비지 컬렉션 상태를 관리하기 위해 포인터에 색상을 추가하는 기법을 사용합니다. 각 객체 포인터는 64비트 주소 공간 중 일부 비트를 사용하여 객체의 상태를 나타냅니다. 이는 객체가 마킹되었는지, 이동 중인지 등을 나타내는 데 사용됩니다. 이러한 방식은 가비지 컬렉션 중 객체 참조의 유효성을 빠르게 판단할 수 있게 합니다.

장점과 단점

구분 내용
장점
  • 매우 낮은 지연 시간
  • 대규모 힙 지원
  • 동시성 처리로 인한 애플리케이션 성능 저하 최소화
  • 메모리 파편화 방지
단점
  • 상대적으로 높은 CPU 사용량
  • 초기 설정 및 튜닝이 복잡할 수 있음

ZGC는 낮은 지연 시간이 중요한 대규모 애플리케이션에 적합하며, 최신 JVM 버전에서 사용할 수 있습니다. ZGC를 사용하려면 JVM 옵션으로 -XX:+UseZGC를 지정하여 활성화할 수 있습니다.

반응형

ZGC와 G1GC의 차이점

ZGC (Z Garbage Collector)와 G1GC (Garbage-First Garbage Collector)는 모두 Java Virtual Machine (JVM)에서 사용되는 가비지 컬렉터이지만, 설계 목표와 작동 방식에서 여러 차이가 있습니다. 두 가비지 컬렉터의 주요 차이점을 설명하겠습니다.

구분 G1GC ZGC
주요 특징
  • Region-based Heap: G1GC는 힙을 고정 크기의 영역(region)으로 나누어 관리합니다. 각 영역은 Eden, Survivor, Old 등의 역할을 할당받습니다.
  • Concurrent Marking: G1GC는 동시 마킹을 수행하여 힙의 라이브 객체를 식별합니다.
  • Mixed Collection: G1GC는 Young 영역과 Old 영역을 동시에 수집하는 Mixed Collection 단계를 포함합니다.
  • Pause Time Goals: G1GC는 사용자 정의 가능한 목표 지연 시간(pause time goal)을 설정하여 가비지 컬렉션의 지연 시간을 예측 가능하게 합니다.
  • Region Evacuation: G1GC는 힙 영역의 살아있는 객체를 다른 영역으로 이동시켜 메모리를 정리합니다.
  • Low Latency: ZGC는 매우 낮은 지연 시간을 목표로 하며, 일반적으로 수 밀리초 이내의 지연 시간을 유지합니다.
  • Region-based Heap: ZGC도 힙을 여러 영역으로 나누어 관리하지만, 영역 크기는 동적으로 결정됩니다.
  • Concurrent Processing: ZGC는 대부분의 가비지 컬렉션 작업을 애플리케이션 스레드와 병렬로 수행합니다.
  • Colored Pointers: 객체 포인터에 색상을 추가하여 객체의 상태를 관리합니다.
  • Large Heap Support: ZGC는 테라바이트 단위의 대규모 힙 메모리까지 지원합니다.
  • Relocation: 살아있는 객체를 새로운 메모리 영역으로 이동하여 메모리 파편화를 방지합니다.
작동 원리
  • Young Collection: 주로 Young 영역(Eden 및 Survivor 영역)에서 발생하며, 살아있는 객체는 Survivor 또는 Old 영역으로 이동합니다.
  • Initial Mark: 힙의 루트 객체를 마킹합니다.
  • Concurrent Mark: 힙 전체를 스캔하여 라이브 객체를 마킹합니다.
  • Remark: 최종 마킹 단계로, Concurrent Mark 단계 이후에 변경된 객체들을 다시 마킹합니다.
  • Cleanup: 사용되지 않는 메모리 블록을 회수합니다.
  • Mixed Collection: Young 영역과 일부 Old 영역을 동시에 수집하여 메모리 파편화를 줄입니다.
  • Marking: Initial Mark, Concurrent Mark, Remark 단계로 나뉘며, 대부분 동시적으로 수행됩니다.
  • Relocation: 살아있는 객체를 새로운 메모리 영역으로 이동합니다.
  • Cleanup: 사용되지 않는 메모리 블록을 회수하여 새로운 객체 할당을 준비합니다.

주요 차이점

구분 G1GC ZGC
지연 시간 사용자 정의 가능한 지연 시간 목표, 일반적으로 ZGC보다 길 수 있음 매우 낮은 지연 시간 (일반적으로 수 밀리초 이내)
힙 구조 고정 크기의 영역 동적으로 크기가 결정되는 영역
가비지 컬렉션 방식 일부 동시 작업과 함께 Young 및 Mixed Collection 수행 대부분의 작업을 애플리케이션 스레드와 병렬로 수행
대규모 힙 지원 대적으로 작은 힙에서도 잘 동작하지만, 대규모 힙에서도 사용 가능 테라바이트 단위의 대규모 힙 지원
메모리 파편화 방지 Region Evacuation을 통해 방지 Colored Pointers와 동시 재배치를 통해 효율적으로 방지
적용 대상 지연 시간과 처리량 간의 균형이 필요한 애플리케이션에 적합 낮은 지연 시간이 중요한 대규모 애플리케이션에 적합

ZGC와 G1GC는 각각의 장단점이 있으며, 애플리케이션의 요구사항에 따라 선택되어야 합니다. ZGC는 낮은 지연 시간이 필요한 대규모 시스템에 매우 적합하며, G1GC는 다양한 크기의 힙에서 안정적으로 동작하며 지연 시간과 처리량 간의 균형을 맞추고자 할 때 유용합니다.

728x90
반응형