본문 바로가기
IT study

ZGC

by suyn 2022. 8. 3.
728x90

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 의 구조가 간단해짐 

| Region

ZGC는 Region을 ZPage로 정의하여 사용. ZPage 는 동적으로 생성/삭제 되며, 2MB의 배수 형태로 관리

 


ZGC 에는 Colored pointers  Load barriers 라는 주요한 2가지 알고리즘이 존재

Colored Pointers

객체를 가리키는 변수의 포인터에서 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를 수행됨. 

  1. Mark Start STW : ZGC의 Root에서 가리키는 객체 Mark 표시
  2. Concurrent Mark/Remap: 객체의 참조를 탐색하면서 모든 객체에 Mark 표시
  3. Mark End STW : 새롭게 들어온 객체들에 대해 Mark 표시
  4. Concurrent Pereare for Relocate: 재배치하려는 영역을 찾아 Relocation Set에 배치
  5. Relocate Start STW : 모든 Root 참조의 재배치를 진행하고 업데이트
  6. 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 시간의 차이가 나는 것을 볼 수 있다고 함! 

728x90

'IT study' 카테고리의 다른 글

[K8S] 쿠버네티스(Kubernetes) 이해하기  (1) 2023.05.04
[Apache] Redirect & Rewrite  (0) 2022.11.13
OpenSSL 이란?  (0) 2022.11.06