ZGC

2021. 10. 10. 17:04Java/Garbage Collection

ZGC란

ZGC는 아래의 목표를 충족하기 위해 설계된 확장 가능하고 낮은 지연율을 가진 GC입니다.

  • 정지 시간이 최대 10ms를 초과하지 않음
  • Heap의 크기가 증가하더라도 정지 시간이 증가하지 않음
  • 8MB ~ 16TB에 이르는 다양한 범위의 Heap 처리 가능

JVM으로 구동되는 애플리케이션의 경우, GC가 동작할 때 pause로 인해 성능에 큰 영향을 미쳐왔습니다. ZGC는 Load barrier와 Colored Pointer를 함께 사용해 puase 시간을 줄여 성능이 향상되었습니다.

Colored Pointer

객체를 가리키는 변수의 포인터에서 64bit를 활용해서 marking을 하고 있습니다.

  • Finalizable: finalizer를 통해서만 참조되는 Object의 Garbage
  • Remapped: 재배치 여부를 판단하는 Mark
  • Marked 1/0: Live Object

이러한 포인터를 사용하기 때문에 ZGC는 반드시 64bit 운영체제에서만 사용 가능합니다.

Load Barrier

위에서 언급한 bit를 이용해 참조 값과 mark 상태를 업데이트하는 것입니다.

ZGC의 형태

ZGC는 메모리를 ZPages라고 불리는 영역으로 나눕니다. ZGC는 동적 사이즈로 2MB의 배소가 동적으로 생성 및 삭제될 수 있습니다. ZGC Heap은 위와 같이 다양한 사이즈의 영역이 여러 개 발생할 수 있습니다.

ZGC의 동작 과정

ZGC의 Marking 과정

Root Set Mark

객체를 참조하는 Root set을 찾아 Marking을 하는 작업입니다. Root Set은 상대적으로 적기 때문에 매우 짧은 pause를 가집니다.

ConcurrentMark & Concurrent Remap

애플리케이션과 동시에 수행되는 단계로 Marking된 Root set으로부터 객체 간의 참조 관계를 추적하여 접근한 모든 객체를 Marking합니다. (Marked bit 체크) 그리고 Load Barrier를 활용하여 Marking되지 않은 Object load를 감지하고 해당 객체의 mark pointer도 표시합니다.

Concurrent Prepare & Edge Handle

Local Thread 간의 동기화를 진행합니다. 이후 Week, Phantom Reference와 같은 일부 edge case를 확인하고 정리합니다.

ZGC 재배치 과정

Concurrent Relocate

Mark 과정이 끝나고 재배치할 대상을 찾아 Relocation Set에 배치합니다. Mapping 되지 않은 대상들은 Heap 메모리에서 정리합니다. Relocation Set에 연결된 대상 중 Root set을 통해 참조되는 모든 객체를 재배치후 업데이트합니다.

Concurrent Relocation and update

Relocation Set에 남아있는 대상들을 추적하며 재배치하고 이전 참조 값과 변경된 참조 값을 Mapping하는 forwarding table에 저장합니다. Load barrier를 이용해 Relocation set에 배치된 대상을 참조하는 Pointer를 감지할 수 있습니다.

728x90

'Java > Garbage Collection' 카테고리의 다른 글

G1 GC  (0) 2021.10.14
Shenandoah GC  (0) 2021.10.09
GC 모니터링  (0) 2021.08.13
GC 튜닝  (0) 2021.08.12