2024-01-08-TIL
Today I Learned
ZGC vs G1GC
둘 다 HotSpot JVM의 가비지 컬렉터(GC)다. GC는 더 이상 쓰지 않는 객체의 메모리를 회수하는데, 이 과정에서 애플리케이션 스레드를 잠시 멈추는 시간(stop-the-world pause)이 생긴다. 두 컬렉터는 이 멈춤을 얼마나, 어떻게 줄이느냐에서 갈린다.
G1(Garbage-First)은 JDK 9부터 서버 환경의 기본 GC다. JEP 248은 기본값을 Parallel GC에서 G1로 바꾸면서, 대개는 처리량을 최대로 높이는 것보다 GC 멈춤 시간을 제한하는 것이 더 중요하다는 이유를 든다. Oracle GC 튜닝 가이드에 따르면 G1은 힙을 같은 크기의 리전으로 나누고, 멈춤 시간 목표를 높은 확률로 맞추면서 처리량도 확보하려 한다. 목표는 -XX:MaxGCPauseMillis로 정하고 기본값은 200ms다. 표시(marking)의 일부는 애플리케이션과 동시에 하지만, 객체를 옮기는 작업은 멈춘 상태에서 한다.
ZGC는 멈춤 시간을 극단적으로 줄이는 데 초점을 둔 컬렉터다. 객체를 옮기는 작업까지 애플리케이션이 도는 동안 동시에 처리한다. JEP 333은 이를 위해 색칠한 포인터(colored pointers)와 로드 배리어를 쓴다고 설명한다. 포인터에 객체 상태를 표시해 두고, 객체를 읽을 때마다 배리어가 그 상태를 확인해서 옮겨진 객체면 새 주소로 고쳐 준다.
ZGC는 몇 번에 걸쳐 발전했다.
| JDK | 변화 | 근거 |
|---|---|---|
| 11 | 실험 기능으로 도입. 목표는 멈춤 10ms 이하, 수백 MB부터 수 TB 힙 | JEP 333 |
| 15 | 정식 기능이 되어 -XX:+UseZGC만으로 사용. 기본 GC는 여전히 G1 | JEP 377 |
| 21 | 세대 구분 ZGC 추가. -XX:+UseZGC -XX:+ZGenerational로 사용 | JEP 439 |
JEP 439는 ZGC의 멈춤 시간이 꾸준히 마이크로초 단위로 측정되는 반면 G1의 멈춤은 밀리초에서 초 단위라고 비교한다. 세대 구분을 넣은 이유는 “대부분의 객체는 젊어서 죽는다”는 약한 세대 가설이다. 젊은 객체만 자주 수거하면 같은 일을 더 적은 CPU로 할 수 있다.
정리하면 G1은 별다른 설정 없이 멈춤 시간과 처리량의 균형을 맞추는 기본 선택이고, ZGC는 응답 지연에 민감하고 힙이 큰 서비스에서 고려할 선택이다. JEP 333이 처음부터 G1 대비 처리량 감소를 15% 이내로 잡았듯 ZGC는 멈춤을 줄이는 대신 처리량을 일부 내준다. 그래서 바꾸기 전에 실제 워크로드에서 지연 시간과 CPU 사용량을 함께 재 봐야 한다.
AI 키워드: EU AI Act 잠정 합의
2023년 12월 9일 유럽의회는 이사회와 AI Act에 대한 정치적 합의에 도달했다고 발표했다. 사회적 점수 매기기, 직장과 학교에서의 감정 인식 같은 용도를 금지하고, 고위험 시스템에는 기본권 영향 평가 같은 의무를, 범용 AI에는 기술 문서와 학습 데이터 요약 같은 투명성 의무를 지운다. 위반 시 벌금은 최대 3,500만 유로 또는 전 세계 매출의 7%다(유럽의회 보도자료).
댓글
아직 댓글이 없습니다