JDK 24에 새로나온 Generational Shenandoah GC에 대해

이세민·2025년 3월 28일
0

기존 Shenandoah GC

좋은 GC는 여러 기준이 있지만, 일반적으로 Stop-The-World의 시간이 짧을수록 좋은 GC로 여겨진다. Shenandoah GC는 이러한 stw의 시간을 줄이기 위해 개발되었다. 다른 GC들은 해당하는 generation 전체를 대상으로 GC를 수행하지만, shenandoah gc는 generation 개념이 없고, region 개념만을 사용한다. 힙을 여러개의 작은 구역으로 나누고 각 구역 마다 독립적으로 GC를 실행한다. brooks pointer를 사용하여 메모리 복사와 동시에 리다이렉트하여, 다른 GC와 달리 Compact과정에서 stw가 발생하지 않는다.
shenandoah gc는 낮은 할당률에 높은 사용률의 상황 또는 높은 할당률에 낮은 사용률인 상황에서 굉장히 낮은 10ms 정도의 stw 시간을 보여준다.

STW(stop the world)가 발생하는 경우

shenandoah gc는 위 그림에서 빨간색으로 표시된 부분에서만 STW가 발생한다.

예외적인 STW 발생

  1. GC를 수행하던 도중, 많은 객체 생성으로 인해 GC가 완료되기 전 메모리가 부족해지는 상황이 발생 할 수 있다. 이러한 경우에는 GC가 동시성을 포기하고 STW를 발생시킨채 GC를 수행한다.
  2. 연속해서 위 경우처럼 GC 수행에 실패하면 Full GC가 발생한다.
  3. shenandoah gc에서 homongous 객체 관리를 위해 드물게 Full GC가 발생한다

단점

  1. 각 region이 독립적으로 GC가 실행되긴 하지만, GC의 대상이 힙 전체이고 앱과 동시에 실행되기 때문에 CPU 사용량이 높다.
  2. Concurrent Compaction을 수행하기 위해 추가적인 메모리 공간을 많이 필요로 한다.
  3. 세대 구분이 없어, 많은 객체들이 빠르게 생성/소멸하는 앱에서는 비효율적이다.

-> 메모리 가용률이 높고, 할당이 많이 발생하면 GC가 자주 실패하고 Full GC 수행이 잦아진다. 또한 심한 경우에는 cpu time의 50% 이상이 GC에 사용되는 경우도 생길 수 있다.

Generational Shenandoah

Generational shenandoah는 위에서 설명한 단점들을 보완하기 위해 개발된 세대 이론을 적용한 GC이다.

세대 이론은 새로 생성된 대부분의 객체는 얼마 사용되지 않고 버려지고, 오래 사용되던 객체는 계속해서 사용할 가능성이 높다는 이론이다.

G1GC 같은 다른 GC들은 대부분 이 세대개념을 사용하여 young-gen과 old-gen으로 메모리를 나누어 관리한다. young-gen 구역은 다시 eden space, survivor space로 나뉜다. eden space에서는 모든 새로운 객체가 할당된다. yougen의 객체들은 두개의 survivor 구현을 왕복하다가 일정 횟수 후에 old 구역을 넘어간다.
기존 GC들은 Young GC의 Mark & Copy 과정이 비동기적으로 실행할 수 없어 STW가 발생한다. 하지만 Generational Shenandoah GC는 기존 Shenandoah gc에서 처럼 앱 실행과 동시에 Mark & Copy를 할 수 있다.

Mixed GC

G1GC에서는 young gc를 실행한 이후에 남는 시간동안 old gc를 일부 실행하는 Mixed GC라는 개념이 있다. Shenandoah gc에서도 유사한 개념이 있다.

Generational Shenandoah는 Marking 단계에서 young & old 구역 모두 동시에 실행 될 수 있다. 대신 young gc의 marking이 더 높은 우선순위를 가진다. young gc 도중 old gc의 marking이 끝나면 marking된 객체들은 GC 후보로 사용된다. young gc가 수행될 때 old gc의 후보들중 일부가 gc에 포함되어 함께 처리된다. 여러번의 young gc를 통해 old gc의 후보 객체들이 모두 처리 되었다면 다시 marking을 진행해, 새 후보를 뽑는다.

G1GC가 Mixed GC를 수행할 때, old gc를 얼마나 수행할지 정하는 기준은 MaxGCPauseMillis이다. GC의 STW시간을 일정수준으로 유지하는 선에서 olg gc를 같이 수행한다. Generational Shenandoah의 경우 거의 대부분의 시간에서 stw가 발생하지 않기 때문에 다른 기준을 사용한다.
Generational Shenandoah는 할당 풀(Eden space)에 객체가 생성되는 속도만큼 처리되는 속도도 빠르게 유지하는 선에서 Old gc를 수행한다. 기존 Shenandoah는 메모리 할당이 자주 이루어질 때 비효율적으로 작동했던 것과 달리 이러한 Mixed GC를 통해 메모리 할당이 급증하는 상황을 유연하게 대처할 수 있다.

마무리

JDK 24가 출시되었다는 소식을 듣고, 릴리즈 노트를 확인했습니다.
Generational Shenandoah가 가장 눈에 들어왔고, 블로그를 적으려고 했는데, 자료가 너무 없어 쓰는것이 너무 힘들었습니다..

Ref

AWS 2022 summit Enhancing_Java_memory_management_with_generational_Shenandoah_OPN302

JEP 404: Generational Shenandoah

AWS corretto github: generational shenandoah branch

profile
gsm 8기 고등학생

0개의 댓글