본문 바로가기

Programming/Java & Spring 관련 내용 정리

[JAVA] GC, stop-the-world, G1GC에 대해서 설명해 주세요.

📍Garbage Collector

 

동적으로 할당한 메모리 영역 중 사용하지 않는 영역을 탐지하여 해제하는 기능 

 

 


📍 Stop-the-world 

 

  • 가비지 컬렉터를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것
  • Stop-the-world가 발생하면 가비지 컬렉터를 실행하는 쓰레드를 제외한 나머지 쓰레드는 모두 작업을 멈춘다.
  • 가비지 컬렉터 작업을 완료한 이후에 중단했던 애플리케이션 실행을 다시 시작한다.
  • 어떤 가비지 컬렉터 알고리즘을 사용하더라도 stop-the-world는 발생한다.
  • 대개의 경우 가비지 컬렉터 튜닝이란 stop-the-world 시간을 줄이는 것이다.

📍Young 영역(Yong Generation 영역)

 

  • 새롭게 생성한 객체의 대부분이 여기에 위치한다.
  • 대부분의 객체가 금방 접근 불가능 상태가 되기 때문에 매우 많은 객체가 Young 영역에 생성되었다가 사라진다.
  • 이 영역에서 객체가 사라질때 Minor GC가 발생한다고 말한다.

Young 영역의 구성

Young 영역은 3개의 영역으로 나뉜다.

  • Eden 영역
  • Survivor 영역(2개)

Survivor 영역이 2개이기 때문에 총 3개의 영역으로 나뉘는 것이다. 각 영역의 처리 절차를 순서에 따라서 기술하면 다음과 같다.

  • 새로 생성한 대부분의 객체는 Eden 영역에 위치한다.
  • Eden 영역에서 GC가 한 번 발생한 후 살아남은 객체는 Survivor 영역 중 하나로 이동된다.
  • Eden 영역에서 GC가 발생하면 이미 살아남은 객체가 존재하는 Survivor 영역으로 객체가 계속 쌓인다.
  • 하나의 Survivor 영역이 가득 차게 되면 그 중에서 살아남은 객체를 다른 Survivor 영역으로 이동한다. 그리고 가득 찬 Survivor 영역은 아무 데이터도 없는 상태로 된다.
  • 이 과정을 반복하다가 계속해서 살아남아 있는 객체는 Old 영역으로 이동하게 된다.
  • Survivor 영역 중 하나는 반드시 비어 있는 상태로 남아 있어야 한다. 만약 두 Survivor 영역에 모두 데이터가 존재하거나, 두 영역 모두 사용량이 0이라면 시스템은 정상적인 상황이 아니라고 생각하면 된다.
  • 포인트 : Eden 영역에 최초로 객체가 만들어지고, Survivor 영역을 통해서 Old 영역으로 오래 살아남은 객체가 이동한다.

 

 

 

 


📍Old 영역(Old Generation 영역)

 

  • 접근 불가능 상태로 되지 않아 Young 영역에서 살아남은 객체가 여기로 복사된다.
  • 대부분 Young 영역보다 크게 할당하며, 크기가 큰 만큼 Young 영역보다 GC는 적게 발생한다.
  • 이 영역에서 객체가 사라질 때 Major GC(혹은 Full GC)가 발생한다고 말한다.
  • Old 영역은 기본적으로 데이터가 가득 차면 GC를 실행한다.
  • GC 방식은 JDK 7을 기준으로 5가지 방식이 있다.
  1. Serial GC
  2. Parallel GC
  3. Parallel Old GC(Parallel Compacting GC)
  4. Concurrent Mark & Sweep GC(이하 CMS)
  5. G1(Garbage First) GC

📍G1GC (Garbage First Garbage Collector)

 

  • 쓰레기로 가득찬 heap 영역을 집중적으로 수집한다.
  • 큰 메모리를 가진 멀티 프로세서 시스템에서 사용하기 위해 개발된 가비지 컬렉터이다.
  • G1GC의 목표는 가비지 컬렉터의 일시 정지시간을 최소화 하면서, 따로 설정을 하지 않아도 가능한 한 처리량을 확보하는 것이다.
  • G1은 실시간 가비지 컬렉터가 아니다. 일시 정지시간을 최소화하되 완전히 없애지는 못한다.

작동 방식

G1GC는 전체 heap을 체스판처럼 여러 영역(region)으로 나누어 관리한다.

 

  • 비어 있는 영역에만 새로운 객체가 들어간다.
  • 쓰레기가 쌓여 꽉 찬 영역을 우선적으로 청소한다.
  • 꽉 찬 영역에서 라이브 객체를 다른 영역으로 옮기고, 꽉 찬 영역은 깨끗하게 비운다.
  • 이렇게 옮기는 과정이 조각 모음의 역할도 한다.
  • 빨간색은 Eden으로 쓰이고 있는 영역을 의미한다.
  • 빨간색 S는 Survivor. Eden이 꽉 차면 라이브 객체를 S로 옮기고 Eden은 비워버린다.
  • 파란색은 old gen 처럼 쓰이고 있는 영역이다.
  • 파란색 H는 한 영역보다 크기가 커서 여려 영역을 차지하고 있는 커다란 객체이다(Humongous Object).

 


아래 게시글을 참고한 후 정리하여 이 게시물을 작성하였습니다.

 

d2.naver.com/helloworld/1329

 

johngrib.github.io/wiki/java-g1gc/#g1gc

 

Java HotSpot VM G1GC

Java9 ~ 12 디폴트 GC

johngrib.github.io