G1, Garbage First 가비지 컬렉터

2025. 12. 17. 18:00·JAVA
반응형

정의

G1은 garbage first라는 이름의 가비지 컬렉터로, 처리 효율이 높으면서 설정된 정지 시간을 맞출 수 있는 곳 부터 쓰레기들을 청소하는 가비지 컬렉터다.

G1의 목표

G1의 설계자들은 정지 시간 예측 모델을 만들고자 했다. 즉, 목표 시간을 M 밀리초로 설정하면 가비지 컬렉터가 쓰는 시간이 M 밀리초가 넘지 않도록 통제하는 것이다.

정리하면 주된 목표는 가비지 컬렉터의 정지 시간을 예측가능하도록 만들어서 블랙박스 상태를 피하려고 하는 것이다.

왜 G1의 설계자들은 정지 시간 예측 모델을 만드려고 했을까?

서버 시스템에서 타임아웃, 로드밸런싱, 장애 전파등의 기준이 시간을 기준으로 서버의 상태를 파악하거나 종료시킨다.

G1 이전의 GC 들은 정지 시간을 예측할 수 없었고 갑자기 너무 긴 시간 GC를 해버린다면 서버가 정상적이지만 GC로 인한 정지 시간으로 인해 타임 아웃, 로드 밸런싱의 서버 다운으로 상태 파악, 그로인한 장애의 전파까지 발생하게 된다.

따라서, G1의 등장으로 인해 블랙박스 같던 GC의 동작을 예측하고 설계를 진행할 수 있게 되었다.

그래서 언제 GC는 언제 하는데?

가비지 컬렉터들은 모두 공통적으로 메모리 할당이 어려울 때 GC를 수행해서, 메모리 여유 공간을 만든다.

생각의 전환

G1의 등장 이전의 CMS를 포함한 모든 컬렉터들의 회수 범위는 신세대 전체, 구세대 전체 또는 자바 힙 전체였다.

G1은 힙 메모리의 어느 곳이든 회수 대상에 포함할 수 있었다. 이를 회수 집합이라 하며 짧게 CSet(Collection Set)이라고 한다.

어느 세대에 속하느냐가 아니라 ‘어느 영역에 쓰레기가 가장 많냐’와 ‘회수했을 때 이득이 어디가 가장 크냐’가 회수 영역을 고르는 기준이 되었다. 이것이 G1의 혼합 GC이다.

G1의 메모리 회수

G1이 생각의 전환을 통해 회수 영역을 쓰레기가 가장 많은, 회수 했을 때 이득이 가장 큰 부분을 회수 영역을 고르는 기준이 되었다. 하지만, G1도 여전히 세대 단위 컬렉션 이론에 기초하고 있다.

G1은 크기와 수가 고정된 세대 단위 영역 구분에서 벗어나서, 연속된 자바 힙을 동일 크기의 여러 독립 리전으로 나눈다. 각 리전은 필요에 따라 신세대의 에덴이나 생존자 공간이 될 수도, 구세대용 공간으로 쓰일 수도 있다.

  • 즉, 고정된 에덴, 생존자, 구세대 공간을 미리 나누는 것이 아니라 필요에 따라 특정 영역을 세대별 할당한다.

G1은 리전 각각에 역할별 전략을 구분하여 적용할 수 있어 회수 효율을 극대화한다.

큰 객체들은 G1의 리전보다 클 수 있다. 따라서 이를 대처하기 위해 거대 리전이라는 특별한 유형을 활용한다. G1은 리전 용량의 절반보다 큰 객체를 큰 객체로 취급한다. 또, 거대 리전은 주로 구세대로 취급한다.

G1은 매번 적절한 수의 리전을 계획적으로 회수하기 때문에 자바 힙 전체를 회수하는 상황을 피하고, 정지 시간을 예측할 수 있다.

간략한 동작

G1은 각 리전의 쓰레기 누적값을 추출하고, 우선순위 목록을 관리한다. 사용자가 매개변수로 설정한 일시 정지 시간이 허용하는 한도 내에서 회수 효과가 가장 큰 리전부터 회수하게 된다.

따라서, ‘가비지 우선’이라는 이름이 붙은 것이다.

구현의 어려움

자바 힙을 다수의 독립 리전으로 나누면 리전 간 참조 문제를 해결해야 한다.

  • G1은 기억 집합을 도입하여 힙 전체를 스캔하는 일을 피한다. 키는 다른 리전으로부터의 시작 주소고, 값은 하나의 집합이다.

동시 표시 단계동안 GC 스레드와 사용자 스레드가 서로 간섭하지 않도록 보장해야 한다.

  • G1은 스냅숏 알고리즘을 사용한다. 동시 표시 단계동안 새롭게 생성된 객체는 특정 포인터를 사용해 특정 주소 공간에 할당하여 암묵적으로 표시한다.

신뢰할 수 있는 정지 시간 예측 모델을 구현해야 한다.

  • G1은 감소 평균을 기초로 하여, 다양한 통계를 분석하여 최근의 평균적인 상태를 사용해 예측한다.

세부 동작

  1. 최초 표시: GC 루트가 직접 참조하는 객체들을 표시한다. 이때는 사용자 스레드를 정지한다.
  2. 동시 표시: GC 루트로부터 객체들의 도달 가능성을 분석하고 회수할 객체를 찾는다.
  3. 재표시: 사용자 스레드를 멈추고, 시작 단계 스냅숏 이후 변경된 소수 객체들을 스캔한다. (동시 표시 단계에서 참조가 변경된 객체들을 스캔)
  4. 복사 및 청소: 통계 데이터를 이용해 회수 가치와 비용에 따라 줄세운다. 그 후, 목표한 일시 정지 시간에 부합하도록 회수 계획을 세운다. 회수할 리전을 선별하고, 선별된 리전에서 살아남은 객체들을 빈 리전으로 이주시킨다. (생존한 객체를 복사하기 때문에 잠시 멈춘다.)

G1은 동시 표시를 제외한 단계에서는 사용자 스레드를 멈춘다. G1의 목표는 지연 시간을 제어하는 동시에 처리량을 최대한 높이는 것이다.

앞으로 GC 방향성

G1을 시작으로 최신 가비지 컬렉터 대다수는 자바 힙 전체를 한 번에 청소하는 대신, 메모리 할당 속도에 맞춰 회수하는 방향으로 변화했다.

출처

  • https://www.oracle.com/technical-resources/articles/java/g1gc.html
  • https://product.kyobobook.co.kr/detail/S000213057051
반응형

'JAVA' 카테고리의 다른 글

왜 JVM GC는 디스크,램과 달리 파편화/단편화 문제를 압축(memory compression)으로 해결한걸까?  (3) 2025.12.10
[JAVA] 객체를 넘겨주지 않고, 외부에서 객체를 사용하기!  (0) 2024.12.11
[JAVA] 생산자 소비자 문제와 자바의 Object.wait() notify()  (2) 2024.10.02
[JAVA] ReentrantLock이 뭔가요?  (1) 2024.09.24
[JAVA] java.util.concurrent.LockSupport 알아보자  (0) 2024.09.24
'JAVA' 카테고리의 다른 글
  • 왜 JVM GC는 디스크,램과 달리 파편화/단편화 문제를 압축(memory compression)으로 해결한걸까?
  • [JAVA] 객체를 넘겨주지 않고, 외부에서 객체를 사용하기!
  • [JAVA] 생산자 소비자 문제와 자바의 Object.wait() notify()
  • [JAVA] ReentrantLock이 뭔가요?
부기(창의)
부기(창의)
창의의 개발블로그입니다.
  • 부기(창의)
    창의
    부기(창의)
  • 전체
    오늘
    어제
    • 분류 전체보기 (227)
      • 고민 (1)
      • 데브옵스 (9)
      • AWS (3)
      • 웹 (17)
      • Docker (2)
      • Git (1)
      • JAVA (15)
      • OOP (3)
        • 디자인 패턴 (1)
      • 백준 (106)
        • JAVA (7)
      • Spring (23)
      • 개발 관련 (5)
      • 알고리즘 (4)
      • TIL (13)
      • 우아한 테크코스 (9)
        • 프리코스 지원과정 (6)
      • NextJS (3)
      • Computer Science (13)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • Github : https://github.com/chan⋯
  • 인기 글

  • 태그

    aws
    우테코 프리코스
    oidc
    SpringBoot
    우테코
    동시성
    백트래킹
    메모리
    운영체제
    Spring Boot
    자바
    스프링
    hibernate
    완전탐색
    jvm
    OS
    알고리즘
    스레드
    완탐
    java
    dp
    다이나믹 프로그래밍
    jpa
    뉴진스
    백준
    도커
    우테코 7기
    ec2
    SSR
    spring
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
부기(창의)
G1, Garbage First 가비지 컬렉터
상단으로

티스토리툴바