ZGC 는 JDK 15버전에서 Production Ready 상태
조금 더 큰 메모리(8MB ~ 16TB) 에서 효율적으로 Garbage Collect 하기 위한 알고리즘
실제로 STW 시간을 줄이기 위해서 Marking 시간에만 STW 을 가져가도록 하고 있음.
ZGC doesn't get rid of stop-the-world pauses completely.
The collector needs pauses when starting marking, ending marking and starting relocation.
But this pauses are usually quite short - only a few milliseconds.
적은 메모리나 큰 메모리에서 STW 시간을 최대한 적게(10ms 이하로) 가져가기 위해 제작되었다
구조도

ZGC Heap - Region 의 구조가 간단해짐
ZGC는 Region을 ZPage로 정의하여 사용. ZPage 는 동적으로 생성/삭제 되며, 2MB의 배수 형태로 관리
ZGC 에는 Colored pointers 와 Load barriers 라는 주요한 2가지 알고리즘이 존재

객체를 가리키는 변수의 포인터에서 64bit 을 활용해가지고, Marking
- Finalizable: finalizer을 통해서만 참조되는 Object의 Garbage
- Remapped: 재배치 여부를 판단하는 Mark
- Marked 1 / 0 : Live Object
그렇기 때문에 ZGC는 반드시 64bit 운영체제에서만 사용 가능함.

Load Barriers
ZGC 는 G1GC 와는 다르게 메모리를 재배치하는 과정에 위에서 언급한 bit 를 바탕으로 STW 없이 재배치
이때 RemapMark와 RellocationSet을 확인하면서 참조와 Mark를 업데이트
아래와 같은 Flow를 수행됨.
- Mark Start STW : ZGC의 Root에서 가리키는 객체 Mark 표시
- Concurrent Mark/Remap: 객체의 참조를 탐색하면서 모든 객체에 Mark 표시
- Mark End STW : 새롭게 들어온 객체들에 대해 Mark 표시
- Concurrent Pereare for Relocate: 재배치하려는 영역을 찾아 Relocation Set에 배치
- Relocate Start STW : 모든 Root 참조의 재배치를 진행하고 업데이트
- Concurrent Relocate: 이후 Load Barriers 를 사용하여 모든 객체를 재배치 및 참조 수정
G1GC 와의 차이점은, 바로 Pointer를 이용해서 객체를 Marking하고 관리하는 것이 핵심
개발자분 말씀으로는 어떠한 Heap 메모리 사이즈가 와도
각각의 STW 시간을 (<10ms) 이하로 줄이는 것이 ZGC 의 궁극적인 목표
성능비교
ZGC 는 위에 설명에서도 아시겠지만, 큰 메모리에 아주 적합한 GC 방식
그래서 성능적으로 많이 이득을 보기 위해서는 메모리가 크면 클 수록 좋을 것으로 추측.

위와 같은 테스트환경은, Heap Size 128G , CPU Intel Xeon E5-2690 2.9GHz, 16core 환경에서 성능을 측정한 결과
최악의 경우에는 G1GC 와 비교했을 때 거의 1000배? STW 시간의 차이가 나는 것을 볼 수 있다고 함!
'IT study' 카테고리의 다른 글
[K8S] 쿠버네티스(Kubernetes) 이해하기 (1) | 2023.05.04 |
---|---|
[Apache] Redirect & Rewrite (0) | 2022.11.13 |
OpenSSL 이란? (0) | 2022.11.06 |