G1GC
이전의 GC는 Young Generation, Old Generation 영역이 고정적었다. 하지만 G1 GC는 고정된 영역이 아닌 전체적인 heap 메모리를 논리적인 단위로 리전을 분리한다
- 큰 메모리를 가진 멀티 프로세서 시스템에서 사용하기 위해 개발된 가비지 컬렉터이다.
- 사용하지 않는 개체의 영역을 수집하고 압축하여 Stop The World를 최소화하였다
- G1은 실시간 가비지 컬렉터가 아니다. 일시 정지시간을 최소화하되 완전히 없애지는 못한다.
- G1은 Java 9부터 디폴트 GC이다.
- G1은 통계를 계산해가면서 GC 작업량을 조절한다.
Heap Layout

G1 GC는 힙 영역을 같은 크기의 region으로 나누고 관리한다. 나눠져서 관리되는 region은 메모리 회수와 할당의 단위가 된다. region 마다 다른 색깔을 띄고 있는데 각각은 다음과 같은 의미를 가지고 있다.
- 빨강색 : Young 영역(Eden)
- 빨강색 + S : Young 영역 (Survivor)
- 파랑색 : Old 영역
- 파랑색 + H : Old 영역 (여러 개의 region이 필요한 사이즈가 큰 객체(humongous object)
- 회색 : 비어있는 부분들. 즉, 언제든지 할당가능한 영역
Garbage Collection Cycle

Young-only 단계
- Concurrent Start
- 이 단계에서 Young GC를 수행하면서 동시에 Marking Phase가 진행된다.
- Concurrent Start Old Region을 GC하기 위해 현재 도달할 수 있는 live 객체(Object)를 결정한다.
- Concurrent Mark가 진행되는 도중에, Young GC가 동작할 수 있으며 이로 인해 방해받을 수 있다.
- Marking은 Remark 와 Cleanup 단계에서 STW를 발생시킬 수 있다.
- Remark
- Marking을 마무리하고 Reference 처리 및 Class Unloading을 수행하여 Empty Region을 회수하고 내부 데이터 구조를 정리
- Remark와 Cleanup 사이에서 G1은 Old Region에서 여유 공간을 회수 할 수 있도록 정보를 계산한다.
- 이 계산은 Cleanup 단계에서의 STW에서 마무리 된다.
- Cleanup
- Region 회수가 실제로 진행될지 결정.
- 만약 공간 재확보(Space-Reclamation) 단계가 온다면, young-only 단계는 1회의 Mixed-GC만 진행하고 완료된다.
Space Reclamation 단계: G1 GC가 Young 영역에 대해서 GC를 처리하는 것 이외에도 Old 영역에서의 GC를 동작시킴으로써 메모리를 회수하는 단계