티스토리 뷰

JAVA

JAVA GC 동작 원리 이해

씩씩이5 2025. 4. 6. 10:35

GC(Garbage Collection)이란?

GC는 JVM의 Heap 영역에서 동적으로 할당됐던 메모리 중 참조되지 않는 객체들을 주기적으로 제거하는 자바의 메모리 관리 기법

GC 대상 식별 기준

GC의 판단 기준은 Reachability 라는 개념을 적용한다.
객체에 레퍼런스가 있는 지를 기준으로, Reachable,Unreachable로 정의한다.

GC 동작 원리

Mark and Sweep

가비지 컬렉션이 될 대상 객체를 Mark하고 Sweep하며 객체가 제거되어 파편화된 메모리영역을 앞에서부터 Compaction채워나가는 작업을 수행한다.

  • Mark : Root Space(Stack의 로컬 변수, Method Area의 Static 변수 등) 로부터 그래프 순회를 통해 연결된 객체들에 마킹하는 단계
  • Sweep : 마킹되지 않은 즉, Unreachable 객체들을 Heap에서 제거
  • Compact : Sweep 후에, 분산된 객체들을 Heap의 시작주소로 메모리 할당.

Heap Memory 구조

동적 레퍼런스 데이터가 저장되는 공간이 Heap 메모리는 객체의 생존기간에 따라 물리적으로 Young Generation 영역과 Old Generation 영역으로 분리하였다.

  • Young Generation : 새롭게 생성된 객체가 할당되는 영역으로, 많은 객체들이 생성되었다가 금방 사라진다. Minor GC
  • Old Generation : Young영역에서 Rechable 상태를 오래 유지한 객체가 복사되는 영역. 영역크기가 더 Young Generation 보다 크고 가비지는 적게 발생한다. Magor GC, Full GC

Young Generation 은 Eden, Survivor0, Survivor1으로 이루어져있고 Minor GC가 발생할때마다 객체 헤더에 age값을 기록하여 임계값에 달하면 Old Generation으로 Promotion 하게된다.

GC의 단점

  • SW성능하락의 문제가 될 수 있음
    : Clean Up 시점이 불명확하고 GC 프로세스 작동 중에는 GC 관련 쓰레드를 제외한 모든 쓰레드가 중지 상태가 된다.Stop The World

-> 하지만 관련하여 GC 최적화 튜닝 작업 및 GC 처리 알고리즘으로 개선할 수 있음.(Serial, ConcMarkSweep, G1 등..)

Java 8의 디폴트 GC인 Parallel GC의 경우, Serial GC 와 기본적인 알고리즘은 같지만, Young 영역의 Minor GC를 멀티쓰레드로 수행시켜, Stop-The-World 시간을 감소시킨다. 옵션을 통해 GC 수행할 쓰레드 갯수 설정 가능

java -XX:+UseParallelGC -jar Application.java 
# -XX:ParallelGCThreads=N : 사용할 쓰레드의 갯수