Java Garbage Collection

이건희·2025년 3월 10일
post-thumbnail

Java의 Garbage Collection과 Heap 구조

Java의 Garbage Collection(GC)은 JVM에서 자동으로 메모리를 관리하는 기능이다. GC의 동작 원리와 Java Heap 구조를 기반으로 Minor GC, Major GC를 알아보자!

1. Java Heap 구조

Java의 Heap 메모리는 크게 Young GenerationOld Generation으로 나뉜다.

Young Generation

  • Eden 영역Survivor 영역(S0, S1)으로 구성된다.

  • 대부분의 객체는 Eden 영역에서 생성되며, 1번 이상 살아남게 되면 Survivor 영역으로 이동한다.

  • Minor GC가 주로 발생하는 공간이다.

Eden 영역

  • new를 통해 새롭게 생성된 객체가 저장되는 공간이다.

  • Eden 영역이 가득 차면 Minor GC가 발생하여 살아남은 객체를 Survivor 영역으로 이동시킨다.

Survivor 영역(S0, S1)

  • Young Generation에는 두 개의 Survivor 영역(S0, S1)이 있다.

  • Minor GC가 발생하면 Eden 영역에서 살아남은 객체가 한쪽 Survivor 영역(S0 또는 S1)으로 이동한다.

  • 이후 Minor GC가 다시 발생하면 살아남은 객체는 다른 Survivor 영역으로 이동하며, 이 과정이 반복된다.

  • Survivor 영역 중 하나는 항상 비어 있어야 한다.

  • 일정 횟수(Age) 동안 Survivor 영역에서 살아남은 객체는 Old Generation으로 이동한다.

Old Generation

  • Young Generation에서 오래 살아남은 객체들이 저장되는 공간이다.

  • 크기가 커서 GC가 적게 발생하지만, 발생하면 시간이 오래 걸린다.

  • Major GC(Full GC)가 발생하는 주요 대상이다.


2. GC의 대상 객체

GC는 특정 객체가 사용되지 않는다고 판단하면 해당 객체를 메모리에서 제거한다.

이때 Reachable 이라는 개념을 사용하는데, 객체가 참조 되고 있는지 아닌지의 여부에 따라 나뉜다.
이전 글에서 Method Area나 Stack Area에서 참조되지 않는 객체들은 Unreachable 객체들이다.


3. Java GC의 종류

Java의 GC는 Heap 영역에서 불필요한 객체를 제거하는 역할을 한다. GC는 크게 Minor GCMajor GC(Full GC)로 나뉜다.

Minor GC

  • Young Generation에서 발생하는 GC
  • Eden 영역이 가득 차면 실행되며, 살아남은 객체를 Survivor 영역으로 이동한다.
  • 비교적 빠르게 수행되며, 애플리케이션의 성능에 큰 영향을 주지 않는다.

  1. Eden 영역이 꽉 차게 되면 Minor GC가 발생

  1. 참조되지 않는 객체들을 삭제하고 살아남은 객체들을 Survivor로 이동

  1. 살아남은 객체들의 Age 값 1 증가

Minor GC에서 객체의 생존 주기 (Age 개념)

  • 객체가 처음 Eden 영역에 생성되면 Age(나이) 값이 0으로 설정된다.

  • Minor GC가 발생하면 살아남은 객체는 Survivor 영역으로 이동하며, Age 값이 증가한다.

  • Age 값이 일정 값(기본 값 31)을 초과하면 Old Generation으로 이동하게 된다.

Major GC (Full GC)

  • Old Generation에서 발생하는 GC

  • Minor GC에서 살아남은 객체들이 Old Generation으로 이동하고, Old Generation이 가득 차면 실행된다.

  • GC가 실행되는 동안 애플리케이션이 멈추는(STW, Stop The World) 시간이 길어 성능 저하를 유발할 수 있다.

Stop The World(STW) 현상

  • 모든 GC는 STW를 유발한다. 즉, GC가 실행되는 동안 애플리케이션의 모든 쓰레드가 멈춘다.

  • Minor GC는 비교적 빠르게 수행되지만, STW가 발생하는 동안 애플리케이션이 일시적으로 멈출 수 있다.

  • Major GC는 실행 시간이 길어 애플리케이션의 성능 저하를 유발할 가능성이 크다.

  • 이를 최소화하기 위해 GC 튜닝 및 적절한 GC 알고리즘 선택이 중요


4. GC 동작 과정 요약

  1. 객체 생성 → Eden 영역에 할당

  2. Eden 영역이 가득 차면 Minor GC 발생 → 살아남은 객체를 Survivor 영역으로 이동

  3. Survivor 영역에서 여러 번 살아남은 객체는 Old Generation으로 이동

  4. Old Generation이 가득 차면 Major GC(Full GC) 발생 → 불필요한 객체 제거

profile
백엔드 개발자가 되겠어요

0개의 댓글