DHistory

[Java] JVM - Garbage Collector 본문

Programming/Java

[Java] JVM - Garbage Collector

ddu0422 2024. 12. 16. 21:00

Overview

Garbage Collector는 사용하지 않는 자원의 메모리를 해제하여 프로그램 메모리를 확보합니다.

GC(Garbage Collection)를 하게 되면 GC 관련 Thread을 제외한 모든 Thread를 멈춥니다.

이를 Stop The World(STW) 라고 합니다.

 

GC의 동작 과정

Mark & Sweep Algorithm을 사용하여 어느 곳에서도 참조하고 있지 않는 객체를 GC 대상으로 선정하여 제거합니다. 

Mark: Root Space(Stack, Method Aread, Native Method Stack)에서 참조하는 객체를 마킹합니다.

Sweep: 마킹되지 않은 객체를 Heap에서 제거합니다.

Compact: 분산된 객체를 Heap의 시작 주소로 모아 메모리가 할당된 부분과 할당되지 않은 부분으로 압축합니다

 

Heap영역

Young Generation

Eden: 객체 생성 시 처음 위치 하는 공간, GC 이후 살아남은 객체를 Survivor 영역으로 보냅니다.

Survivor 0/Survivor 1: 최소 1번의 GC 이상 살아남은 객체가 존재하는 영역입니다. Survivor 0 혹은 Survivor 1 둘 중 하나의 영역은 비어있어야 합니다.

⇒ Minor GC가 일어나며 Max Age가 될 때까지 반복합니다. (Eden → S0 → S1 → S0 → S1 …)

 

public class Main {
    public static void main(String[] args) {
        HotSpotDiagnosticMXBean bean = ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class);
        System.out.println("MaxTenuringThreshold(age): " + bean.getVMOption("MaxTenuringThreshold").getValue());
    }
}
// MaxTenuringThreshold(age): 15

 

Old Generation

Survivor 영역에서 살아남은 객체 중 Max Age를 넘은 경우 Old Generation으로 이동합니다.

Old Generation이 가득 찬 경우 Major GC가 일어납니다.

 

Permanent

Java 7 버전까지는 Heap Area에 존재 / 8 버전부터 Native Method  Stack에 편입했습니다.

 

 

 

GC Algorithm의 종류

Serial GC

  • GC 쓰레드 1개
  • STW 가장 김

Parallel GC

  • Java 8의 기본 GC
  • CPU 개수 = GC 쓰레드 개수
  • Young 영역의 Minor GC를 멀티 쓰레드로 수행
  • Serial GC에 비해 STW 시간 감소

 

Parallel Old GC

  • CPU 개수 = GC 쓰레드 개수
  • Young + Old 영역 멀티 쓰레드로 수행
  • Mark-Summary-Compact 방식 이용
특성
Mark Sweep Compact
Mark Summary Compact
단계
Mark, Sweep, Compact
Mark, Summary, Compact
단편화
높음
낮음
정지 시간
상대적으로 김
상대적으로 짧음
구현 복잡성
낮음
높음
메모리 관리
전체 대상 수집
부분 대상 수집 및 요약 정보 활용

 

G1 GC

  • Java 9의 기본 GC
  • Region 개념을 도입
  • G1 GC 부터는 Eden → Survivor 0 → Survivor 1 → Old 로 순차 이동을 하지 않고 효율적인 위치로 객체 할당

 

 

 

Shenandoah GC

  • Java 12에 Release
  • G1이 가진 Pause 이슈 해결
  • Java Thread와 GC Thread 병렬적으로 실행
  • Init Marking → Concurrent Marking → Final Marking → Concurrent Compaction

ZGC

  • Java 15에 Release
  • ZPage 개념을 도입
  • G1의 Region 크기 고정이지만, ZPage는 2mb 배수로 동적 운영
  • STP 시간 10ms를 넘지 않음

'Programming > Java' 카테고리의 다른 글

JIT Compiler?  (0) 2024.09.22