2024-01-20-TIL
Today I Learned
G1GC vs ZGC
두 컬렉터의 구조와 연혁은 1월 8일 TIL에 정리했다. 이번에는 링크한 글을 바탕으로 차이를 한 번 더 보고, 실제로 바꿔 볼 때 무엇을 설정하고 확인하는지 정리한다.
첫 번째 링크는 힙을 나누는 단위의 차이를 짚는다. G1은 힙을 고정 크기의 리전으로 나누고, ZGC는 ZPage라는 크기가 동적으로 정해지는 단위를 쓴다. 또 ZGC는 비싼 작업을 모두 애플리케이션과 동시에 수행해서 멈춤을 10ms 미만으로 줄이는 것을 목표로 한다고 설명한다. 이 10ms는 JDK 11에서 ZGC를 처음 들일 때 JEP 333이 내건 목표와 같다. JDK 21의 세대 구분 ZGC를 다룬 JEP 439는 멈춤 시간이 꾸준히 마이크로초 단위로 측정된다고 적고 있다.
ZGC를 써 보는 데 필요한 설정은 많지 않다. OpenJDK ZGC 위키의 안내를 따르면 다음과 같다.
1
2
# JDK 21에서 세대 구분 ZGC 사용
java -XX:+UseZGC -XX:+ZGenerational -Xmx8g -Xlog:gc* -jar app.jar
-XX:+UseZGC: ZGC를 켠다. JDK 21에서 세대 구분 모드를 쓰려면-XX:+ZGenerational을 함께 준다.-Xmx: 위키는 최대 힙 크기를 ZGC의 가장 중요한 튜닝 옵션으로 꼽는다. ZGC는 동시 컬렉터라서, GC가 도는 동안에도 새 할당을 받아 줄 여유 공간이 힙에 있어야 한다. 필요한 여유는 할당 속도와 살아 있는 객체의 크기에 따라 다르다.-Xlog:gc*: GC 로그를 자세히 남긴다. 바꾸기 전과 후를 비교하려면 이 로그가 필요하다.
위키는 ZGC가 실행 중에 세대 크기, GC 스레드 수, 승격 기준을 스스로 조정하도록 설계되어 있어서 손으로 만질 설정이 적다고 설명한다. 그래서 G1에서 넘어갈 때 G1용 튜닝 옵션을 그대로 가져가기보다는, 힙 크기만 정하고 시작하는 편이 맞다.
비교할 때는 멈춤 시간만 보면 안 된다. 1월 8일 TIL에 적었듯 ZGC는 처리량을 일부 내주는 대신 멈춤을 줄인다. 응답 시간 분포(특히 p99 같은 꼬리 지연), CPU 사용률, 처리량을 함께 기록해야 바꾼 효과를 판단할 수 있다. 두 번째 링크는 ZGC를 두고 Java 개발자들이 의견을 나눈 Reddit r/java 스레드다.
- https://incheol-jung.gitbook.io/docs/q-and-a/java/g1-gc-vs-z-gc
- https://www.reddit.com/r/java/comments/129kjbq/what_do_you_think_about_zgc_being_the_jdks/?rdt=37993
AI 키워드: AlphaGeometry
1월 17일 Google DeepMind가 기하 문제를 푸는 AI 시스템 AlphaGeometry를 발표했다. 국제수학올림피아드(IMO) 기하 문제 30개 중 25개를 제한 시간 안에 풀었는데, 같은 문제에서 금메달리스트의 평균은 25.9개였다. 언어 모델과 기호 추론 엔진을 결합한 구조이고, 합성한 예제 1억 개로 학습했다. 연구는 Nature에 실렸다(Google DeepMind 블로그).
댓글
아직 댓글이 없습니다