ZGC(Z Garbage Collector)는 JVM(Java Virtual Machine)에서 Serial -> Parallel -> CMS -> G1 이후에 사용되는 최신의 가비지 컬렉터 중 하나로, 대규모 애플리케이션에서의 낮은 지연 시간과 높은 처리량을 목표로 설계되었습니다. ZGC는 Java11에 처음 도되었으며, 계속해서 개선되고 있습니다. ZGC의 주요 특징과 작동 방식을 상세히 설명드리겠습니다.
ZGC의 주요 특징
- 저지연: ZGC는 가비지 컬렉션으로 인한 지연 시간을 매우 짧게 유지하는 것이 특징입니다. 일반적으로 수 밀리초 이내로 유지되며, 이는 대규모 애플리케이션에서 매우 중요한 성능 요소입니다.
- 대규모 힙 지원: ZGC는 테라바이트 단위의 대규모 힙 메모리까지 지원합니다. 이는 대용량 데이터를 처리하는 애플리케이션에서 매우 유용합니다.
- 컴팩션 지원: ZGC는 메모리 파편화를 방지하기 위해 메모리 컴팩션을 지원합니다. 컴팩션은 메모리를 재배치하여 더 큰 연속된 메모리 블록을 확보하는 과정입니다.
- Concurrent Processing: ZGC는 대부분의 가비지 컬렉션 작업을 애플리케이션 스레드와 동시에 수행합니다. 이는 애플리케이션의 성능 저하를 최소화합니다.
- Colored Pointers: ZGC는 colored pointers라는 독특한 기법을 사용하여 객체의 상태를 관리합니다. 이는 가비지 컬렉션의 효율성을 높이고 지연 시간을 줄이는데 도움을 줍니다.
ZGC는 메모리 단편화를 줄이고 관리 효율성을 높이기 위해 다양한 크기의 메모리 블록으로 Heap을 나누어 사용합니다. 마찬가지로 각 Heap 영역은 서로 다른 역할을 담당합니다.
- Small: 작은 객체들이 할당되는 영역.
- Medium: 중간 크기 객체들이 할당되는 영역.
- Large(N x 2 MB): 큰 객체들이 할당되는 영역. N은 객체 크기에 따라 달라집니다.
ZGC는 크게 다음과 같은 단계로 가비지 컬렉션을 수행합니다.
1. Marking(마킹)
- Initial Mark(초기마킹) : 애플리케이션 스레드가 실행 중인 동안 루트 객체들을 마킹합니다.
- Concurrent Mark(동시마킹) : 애플리케이션 스레드와 병렬로 힙 전체를 스캔하여 객체들을 마킹합니다.
- Remark(재마킹) : 최종 마킹 단계로, Concurrent Mark 단계 이후로 변경된 객체들을 다시 마킹합니다.
2. Relocation(이동)
- Concurrent Relocate(동시이동) : 애플리케이션 스레드와 병렬로 살아있는 객체들을 새로운 메모리 영역으로 이동합니다.
3. Cleanup(정리)
- 사용되지 않는 메모리 블록을 회수하여 새로운 객체가 할당될 수 있도록 합니다.
ZGC 장/단점
구분 | 내용 |
장점 | 매우 낮은 지연 시간 대규모 힙 지원 동시성 처리로 인한 애플리케이션 성능 저하 최소화 메모리 파편화 방지 |
단점 | 상대적으로 높은 CPU 사용량 초기 설정 및 튜닝이 복잡할 수 있음 |
ZGC는 낮은 지연 시간이 중요한 대규모 애플리케이션에 적합하며, 최신 JVM 버전에서 사용할 수 있습니다. ZGC를 사용하려면 JVM 옵션으로 -XX:+UseZGC를 지정하여 활성화할 수 있습니다.
로그프레소에서 기존 JDK11버전에서 JDK21버전으로 변경한 이유가 무엇일까?
ZGC는 대규모 힙 메모리를 지원하며, 애플리케이션 스레드와 동시에 가비지 컬렉션을 수행하는 저지연가비지 컬렉터입니다. 기존 G1 GC나 Parallel GC와 비교했을 때, 힙 메모리 크기를 테라바이트 단위까지 확장할 수 있어 대용량 데이터를 다루는 환경에서 뛰어난 성능 향상을 기대할 수 있습니다. 특히, 메모리 압박으로 인해 발생하는 지연 시간을 줄이고, 객체를 동시 마킹·이동하는 과정을 통해 연속적인 메모리 확보 및 컴팩션을 구현합니다. 이를 통해 메모리 관리와 성능 면에서 장점을 제공합니다.
로그프레소 환경에서 JDK 11에서 JDK 21로 전환한 근본적인 이유는 바로 이러한 ZGC의 도입 가능성 때문입니다. JDK 11 시절에는 실질적으로 힙 메모리를 32GB 이상 올리기 어렵고, 그로 인해 대규모 로그 데이터를 조회할 때 속도 저하 문제가 발생했습니다. 하지만 JDK 21에 포함된 ZGC를 사용하면 테라바이트 단위까지 힙 메모리를 확장할 수 있으므로, 애플리케이션이 요구하는 부하나 CPU 코어 수에 맞추어 훨씬 큰 힙 메모리를 활용할 수 있게 됩니다. 그 결과, 많은 컬럼을 가진 데이터나 다량의 동시 쿼리를 처리해야 하는 환경에서도 성능 저하 없이 안정적인 동작이 가능해집니다.
즉, JDK 업데이트를 통해 힙 메모리 확장성과 저지연 GC 기능이 확보되었고, 이를 통해 로그 조회 속도, 동시 처리 성능, 메모리 활용 효율성이 향상되었기 때문에 JDK버전을 21버전으로 업데이트한 것 같습니다.
'LOGPRESSO > 로그프레소' 카테고리의 다른 글
[LOGPRESSO]수집 개념 정리 (1) | 2024.09.24 |
---|
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!