JDK 17로 버전업을 준비하면서 ZGC도 간략하게 정리해봤습니다.

기존에 알고 있던 내용도 있었지만, 리마인드차원에서 정리한 부분도 있습니다.

ZGC 간략한 정리 마인드맵 버전

-----

아래는 위 마인드맵의 아웃라인 텍스트 버전입니다.

 

 

ZGC 간략한 정리
ZGC란?
적용 버전
JDK 11에서 실험적 기능으로 추가
JDK 15에서 정식 GC로 인정
LTS 버전인 JDK 17에도 반영
ZGC 메모리 구조
메모리를 ZPage라는 논리적인 단위로 구분
G1 GC에서는 region 이라는 논리 단위 사용
ZPage는 3가지 타입 존재하고, 들어갈 수 있는 객체 크기가 제한됨
small
medium
large
주의: 단 하나의 객체만 할당 가능
colored pointer
Linux x86-64 아키텍쳐에서 가상 메모리 주소를 위해 48bit 사용해 256TB 대역의 가상 메모리를 사용
ZGC는 6bit적은 42bit를 사용
42~45번째 bit는 colored pointer로 사용해 GC처리에 활용
colored pointer에는 marked0, marked1, remapped, finalizable이 있다
marked0과 marked1, remapped는 각 포인터를 사용하는 CG 단계에서 마스킹을 통해 가상 메모리 주소를 가져오는 데 사용
그렇기 때문에 ZGC를 사용하는 환경에서는 RSS(resident set size)가 실제 메모리 사용량보다 3배 크게 관측
주의: 트래픽이 많은 환경에서 JVM heap 설정에 맞게 maxmapcount 값을 수정하지 않으면  JVM 크래시
이를 확보하지 않고 JVM을 실행해 OOM(out of memory)가 발생하게 하면 크래시가 발생한다
(max_capacity/ZGranuleSize) x 3 x 1.2'로 설정
sudo cat /proc/sys/vm/max_map_count
AWS와 같은 클라우드에서 OOM killers에 의해 강제 종료 되는걸 조심
예) -xmx=4G → RSS ~= 12G : 실제 메모리는 4G 까지 써도 RSS 사이즈는 12G정도까지 관측될 수 있음
load barrier
load barrier는 쉽게 말해 heap으로부터 참조가 일어날 때마다 실행되는 코드
참조전에 방어막처럼 막음
ref가 유효한지 체크해서 fast path, slow path 등
ZGC의 처리 방식
10단계를 거쳐서 처리
coloring
phase 1~phase 5
이전 세대 GC의 marking과 동일
Java heap에 있는 객체 중 reachable 객체와 unreachable 객체를 탐색해 표시(marking)하는 과정
unreachable 객체는 더 이상 참조가 일어나지 않는 객체이기 때문에 GC의 대상
relocation
phase 6~phase 10
coloring 단계를 거친 객체를 재배치하는 단계
특징
STW 상태를 10ms 아래로 가져가는 것
대기 시간이 짧은 Application에 적합한 GC
Thread가 실행중일때 동시 작업을 수행하기에 모든 작업을 동시에 수행 (병렬처리)
8MB~16TB까지의 heap 크기를 지원
적용 방법
JDK 17이상(가능하면) 사용
-XX:+UseZGC
참고 링크
https://d2.naver.com/helloworld/0128759
https://www.blog-dreamus.com/post/zgc%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C
https://ionutbalosin.com/2020/01/hotspot-jvm-performance-tuning-guidelines/

+ Recent posts