Java G1 GC(Garbage-First Garbage Collector)

2 minute read

GC 기본 개념

GC(이하 Garbage Collector)는 두 가지 전제 조건으로 만들어 졌습니다.

  • 대부분의 객체는 금방 접근 불가능 상태가 된다.
  • 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다.

Stop-the-world

Minor GC 또는 Full GC가 실행되기 위해 JVM이 애플리케이션을 멈추는 행위입니다. STW가 발생하면 GC 쓰레드를 제외한 모든 쓰레드는 작업을 멈춥니다. 이후 GC 작업이 완료되는 시점에 중단된 쓰레드들이 다시 작업을 시작합니다.

G1 GC 이전의 Heap 구조

예제1

G1 GC가 등장하기 이전의 GC Heap 구조는 위 그림과 같습니다. Young 영역Old 영역등 고정적인 Heap영역으로 구성되어 있습니다.

G1 GC

대용량 메모리와 멀티 프로세서 시스템을 대상으로 제작된 Garbage Collector입니다. G1(Garbage-First) 이름과 같이 참조되지 않는 객체들을 우선적으로 Heap영역을 정리하며, G1GC의 목표는 일시 정지 시간(STW)를 최소하 하는 것을 목표로 합니다.

이전의 GC Heap 구조는 물리적으로 Young 영역과 Old 영역을 구분하여 객체들을 관리하였지만 G1GC는 객체를 저장하는 기본 개념은 가지지만 Heap 영역을 논리적으로 구분합니다.

The G1 garbage collector is fully supported in Oracle JDK 7 update 4 and later releases.

G1 GC는 Oracle JDK 7 업데이트 4이상 릴리즈에서 온전히 지원된다고 합니다.

G1 GC 구조

예제2

이전의 GC에서 Heap 구조와는 다른 전체 Heap을 체스판처럼 여러 Resion이 동적으로 나뉘고 관리되며 Resion마다 각각의 역할을 분담합니다. 기본적으로 Resion 영역의 크기는 전체 Heap Size / 2048로 나뉩니다. 만약 8GB Heap을 사용 중이면 하나의 Resion 크기는 8192MB / 2048이므로 4MB입니다.

Resion의 역할

  • Eden Resion
  • Survivor Resion
  • Old Resion
  • Humongous Resion
  • Available/Unused Resion

Humongous Resion은 Resion의 크기가 50%를 초과하는 객체를 저장하기 위한 공간입니다. Full GC에 영향을 받지 않아서 메모리 단편화가 발생 할 수 있습니다.

Available/Unused Resion은 사용되지 않은 영역을 의미합니다.

동작 방식

Young GC(이하 Minor GC)

예제2

  • 기본적으로 멀티 스레드로 Minor GC가 동작합니다.
  • 모든 Eden Resion 또는 Survivor Resion 중에서 임계 값이 충족되면 GC 대상 객체가 많은 Resion을 Survivor Resion으로 이동 시킨 후, 비워진 Resion을 재사용 할 수 있는 형태로 만듭니다.
    • 예를 들어, Eden Resion이 가득차서 GC(minor)가 발생하면 참조 중인 객체를 Marking
    • 모든 객체의 참조가 끊긴 Resion부터 메모리를 회수 Sweep
    • 참조 중인 객체를 다른 Resion으로 이동

 

G1 GC의 Concurrent Cycle

예제2

오라클에서 G1GC는 두 단계로 나누어서 설명하고 있습니다. Young-only 단계는 Eden, Survivor Resion에 존재하는 객체가 Old Resion으로 승격(promote)하는 과정과 Space Reclamation 단계는 메모리를 회수하는 과정을 함께 다룹니다.

  • Old Resion의 점유율이 임계 값(기본 값: 45)에 도달하면 Young-only 단계를 수행합니다.
  • Concurrent Start
    • 모든 Resion에 대해 GC 대상 객체의 존재 여부를 파악하고 대상 객체가 존재하지 않는 Resion은 이후 단계에 제외시킵니다.
  • Remark
    • 최종적으로 GC 대상에서 제외 될 객체를 식별하는 과정에서 STW가 발생합니다.
  • Cleanup
    • 참조 중인 객체의 개수가 가장 적은 Resion에 대해 참조 중이지 않은 모든 객체를 제거한다. 이 과정에서 STW가 발생한다. 이후 빈 Resion들은 재사용성을 위해 free list에 추가된다.
  • Space Reclamation
    • 멀테 스레드로 동작하며 Cleanup 과정에서 GC 대상인 Resion 중에 아직 참조 중인 객체가 존재하면 새로운 Resion으로 복사되고 GC 대상이였던 Resion들은 Compaction 작업이 이루어진다.

Categories:

Updated:

Leave a comment