G1GC (Garbage Collector) - Java 9~ 기준

이동훈·2023년 6월 29일
0

G1GC (Default Java9~)

이전의 전통적인 GC와 달리, region이라는 직사각형 논밭과도 같은 구획으로 구분된다.

Region 간 별다른 공간적 지역성 없이 Young Region과 Old Region이 배치되며, 점유율조차 자유롭다.
각 Region은 기본값으로 1M을 차지하며, Java 7에서는 1MB 고정, Java 8에서는 최대 32MB, Java 9부터는 크기의 제한이 없다.

Eden Region, Survivor Region, Old Region, 그리고 크기가 큰 객체의 할당을 위해 신설된 Humongous Region이 존재한다.

Minor GC가 일어나면 Eden Region 혹은 Survivor Region은 해당 Region에서 Copying 알고리즘(Mark&Sweep)을 통해 비어있는(Available/Unused) Region에 Marked된 객체를 옮기게 되고, 사용했던 Region은 메모리가 해제되어 Available한 상태가 된다.


특징

0) Generation -> Region

더 이상 'Generation' 개념은 존재하지 않는다!

다만 'Young', 'Old' 개념은 여전히 존재한다.
Eden Region과 Survivor Region이 Young Region 개념에 포함되며, Old Region과 Humongous Region이 Old Region 개념에 포함된다.

Survivor Region에서 age가 누적된 객체가 Old Region으로 promote되는 것 또한 같으며, Humongous한 객체가 Eden을 거치지 않고 바로 자리를 점하게 되는 것 또한 같다(다만 별도의 Region을 차지하게 되었다).

1) Minor GC

Eden과 Survivor Region은 Young Region으로 구분되며, 이에 속하는 '개개의' Region들이 용량이 부족할 시 '해당 Region 내의 메모리 영역에 한해서' Minor GC가 일어난다.

그림으로 설명하자면, 다음과 같다.

Region이 가득 찼다! (Minor GC 발생)참조가 되고 있는 객체를 Mark한 뒤 Available한 Region에 Copying을 실시한다.기존 Region은 날려버린다!(Sweep)

똑같이 복사 알고리즘에 의한 Mark & Sweep 및 promote가 동작하지만, 차이점이 있다.

1. 더 이상 S0, S1개념이 없다.

Eden 및 Survivor Region은 다른 Region에 관여하지 않고 자신의 Region 내에 Mark된 객체만을 이동시킨다.
이 때에 이동 대상은 현재 비어있는 Available Region이다. (이는 Eden+Survivor0 -> Survivor1 과정과 사뭇 다른 모습이다.)

2. 이전의 GC들과 달리 Young Generation 전체에 Minor GC가 이루어지지 않는다.

기존의 GC는 Young Generation 영역 전체에서 이루어졌지만, 이제는 나누어진 Region 하나에 국한되기 때문에 효율적이고 신속하다. 즉, 성능이 개선되었다.

2) Major GC

상술하였듯, G1GC는 Old를 여러 개의 region으로 나누어 관리하며, 객체가 promote되면 이 객체는 '가능한 가장 큰 Old Region에 할당'되도록 동작한다.

  • 동작 과정은 다음과 같다.
  1. promote 과정에서 만약 대상 Region의 용량이 가득 찬 경우, 그 다음으로 큰 Old Region으로의 편입을 시도하며, 이도 실패하면 계속해서 큰 규모의 Region을 상대로 시도한다.

  2. 그 어디에도 편입되지 못한다면, 비어있는 Available Region에 자리잡게 된다.

  3. 그리고 최종적으로, 비어있는 Available Region조차 존재하지 않는다면, 끝판왕으로 Major GC가 실행된다.

또한 마찬가지로 Humongous 객체를 할당할 Region이 없다면 Major GC가 실행된다.

profile
Fool Snack Developer

0개의 댓글