포스트

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 블로그).

이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.

댓글

아직 댓글이 없습니다