Java2 min read

G1GC 동작 원리: Region·Young·Mixed GC와 로그 확인

2020년 11월 7일2 min read작성자 Flature

G1GC의 Region, Young·Mixed 수집과 동시 마킹을 구분합니다. JDK 9 이상 GC 로그 설정과 일시 정지·회수 후 힙을 보는 순서, 튜닝 전 확인할 제약을 정리합니다.

G1GC는 힙을 Region 단위로 관리하면서 Young 수집과 동시 마킹, 일부 Old Region을 포함하는 Mixed 수집을 조합하는 가비지 컬렉터입니다. 동시 작업이 있어도 Stop-The-World(STW)가 없어지는 것은 아닙니다. 이 설명의 기준 문서는 JDK 21이며, 실제 단계·로그는 사용 JDK에서 확인하세요.

Region과 Young·Mixed 수집

개념읽는 방법
Region힙을 나눈 단위. Eden·Survivor·Old 등의 논리적 역할을 가질 수 있음
Young GCYoung 영역의 살아있는 객체를 다른 Region으로 이동하며 회수
동시 마킹회수 판단을 위해 살아있는 객체를 추적. 일부 단계는 STW
Mixed GCYoung과 선택한 Old Region을 함께 수집

Remembered Set은 단순히 객체의 저장 위치 목록이 아니라 Region 사이의 참조를 추적하는 데 사용됩니다. SATB는 Snapshot At The Beginning의 약자이며, 기존 글의 STAB 표기는 수정합니다. 동시 마킹 중 객체의 생존 여부가 바뀌므로 한 번의 사이클이 모든 쓰레기를 즉시 회수하는 것은 아닙니다.

JDK 9 이상에서 GC 로그 남기기

다음은 G1과 통합 로깅을 명시하는 실행 예제입니다. 실제 애플리케이션 JAR과 쓰기 가능한 로그 경로를 지정하세요. JDK 8의 PrintGC 계열 옵션과 혼용하지 않습니다.

java -XX:+UseG1GC   -Xlog:gc*:file=gc.log:time,uptime,level,tags:filecount=5,filesize=20M   -jar app.jar

이 명령만으로 특정 GC가 반드시 발생하지는 않습니다. 워크로드가 실행된 구간의 pause 종류·소요 시간·회수 전후 힙과 발생 간격을 함께 봅니다. 기존 본문의 2020년 로그는 과거 JDK 형식이며 현재 환경의 측정값으로 사용하지 않습니다.

로그를 볼 때의 점검 순서

  1. java -version, 실제 JVM 플래그, 컨테이너 메모리 제한을 기록합니다.
  2. 응답 지연 시간대와 GC 일시 정지 시간대를 대조합니다.
  3. 회수 후에도 힙 사용량이 계속 증가하는지, 할당량 증가로 주기가 짧아지는지 구분합니다.
  4. Full GC·evacuation 문제나 큰 객체 관련 징후가 있다면 해당 JDK의 원인별 지침을 확인합니다.
  5. 한 번에 하나의 조건을 바꾸고 같은 부하에서 지연·처리량·메모리를 비교합니다.

튜닝 전에 피할 오해

MaxGCPauseMillis는 목표이지 모든 정지가 그 이하여야 한다는 보장이 아닙니다. 목표를 낮추면 처리량·CPU 등과의 교환이 생길 수 있습니다. G1이 Young 영역 크기를 조절하므로 근거 없이 이를 고정하거나 여러 옵션을 한꺼번에 바꾸지 마세요. 회수 후 사용량 상승만으로 메모리 누수를 확정할 수도 없습니다. 힙의 생존 객체와 부하 변화를 함께 조사해야 합니다.

참고 자료

기존 기록의 화면과 도식

최초 발행 당시의 참고 자료입니다. 최신 설정은 위 설명과 해당 버전의 공식 문서를 확인하세요.

jvm memory
heap memory
g1gc heap layout