[F-Lab 모각코 챌린지] 31일차 - ZGC(1)
F-Lab 모각코 챌린지 31일차 정리 내용입니다 ZGC 에 대해 정리 하였습니다. 하지만 내용이 너무 많아서 여러 부로 나누었습니다.
![[F-Lab 모각코 챌린지] 31일차 - ZGC(1)](/content/images/size/w1200/2023/06/-------_--------_-------25.png)
Z GC
Z Garbage Collector
- ZGC 는 대규모 힙과 낮은 지연시간을 목표로 설계되었다
- Java 11 에서 실험적으로 추가되었으며 Java 15 에서 안정되었다
- Java 15 에서도 기본 GC 는 G1GC 인데, ZGC 는 옵션을 통해 사용할 수 있다
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC
기본 설명
Mark & Sweep
GC 는 기본적으로 Mark & Sweep 알고리즘을 사용한다
- Mark: 사용중인 객체를 마킹
- Sweep: 마킹되지 않은 객체들의 메모리를 회수
ZGC 역시 이와 같은 알고리즘을 사용하여 GC 를 수행한다
ZPage
ZGC 는 메모리 영역(Region) 을 동적으로 생성/삭제 하며 부여한다. 이러한 메모리 영역을 ZGC 에서는 ZPage 로 정의한다.
이러한 ZPage 는 2MB 배수 형태로 관리하며 아래의 타입으로 분류한다
![](https://blog.pollra.com/content/images/2023/06/image-5.png)
- Small (2MB)
- Medium (32MB)
- Large (N*2MB)
ZGC 단계
ZGC 는 총 9단계로 이루어져있다. C++ JNI 코드 주석 보기
- Pause Mark Start
ZGC 의 GC 사이클을 시작한다
이 단계에서는 ZGC 가 객체 그래프 탐색을 시작하기 위한 루트 집합을 식별한다
루트(Root) 집합을 찾는 과정은 애플리케이션 스레드를 잠시 중단하는 상태에서 진행된다. - Concurrent Mark
루트 집합에서 시작하여 힙에 있는 모든 객체를 탐색하며, 도달 가능한 객체를 마킹한다
이 과정은 애플리케이션 스레드와 동시에 병렬로 수행된다 - Pause Mark End
마킹 프로세스를 완료하는 데 필요한 최종 작업을 수행한다
애플리케이션 스레드는 잠시 중단된다 - Concurrent Process Non-Strong References
약한 참조(Weak references), 소프트 참조(Soft references), 팬텀 참조(Phantom references), finalizable 객체와 같은 '강하지 않은(Non-Strong)' 참조를 감지하고 필요한 경우 메모리 회수를 진행한다 - Concurrent Reset Relocation Set
ZGC 가 이동할 객체들을 담을 relocation set 을 초기화 한다
이는 다음 단계에서 이동 할 객체들을 선택하는 데 사용된다 - Pause Verify
ZGC 가 힙의 일관성을 확인한다 - Concurrent Select Relocation Set
이동 할 객체들을 선택한다
힙 메모리의 단편화를 줄이고 메모리를 효율적으로 사용하기 위함 - Pause Relocate Start
이동 할 객체들의 집합을 최종적으로 선정하며 이동이 필요한 메모리 영역을 준비한다
이 과정에서 애플리케이션 스레드는 잠시 중단된다 - Concurrent Relocate
선택된 객체들을 새로운 위치로 이동시키는 실제 재배치 작업을 수행한다
이 작업은 애플리케이션과 동시에 수행되며 메모리가 회수되고 힙의 단편화가 줄어든다
9.1. 객체 이동: 선택된 relocation set 내부의 객체들은 새로운 위치로 이동된다
9.2. 참조 업데이트: 이동된 객체들을 가리키는 모든 참조가 새로운 위치로 업데이트 된다
9.3. 메모리 회수: 객체가 이동한 후, 이전 영역을 더 이상 사용되지 않으므로 메모리가 회수된다