본문 바로가기
Java

[JAVA] GC의 내부 동작

by 차가운개발 2024. 12. 9.

가비지 컬렉터는 힙 메모리에서 더 이상 사용되지 않는 객체를 탐지하고 제거하여 메모리를 회수하는 역할을 한다. 프로그래머가 명시적으로 메모리를 해제하지 않아도 메모리 누수를 방지하고, 힙 메모리를 효율적으로 사용하도록 돕는 역할을 한다.

 

GC의 주요 동작 과정

1. 루트 탐색

GC는 사용중인 객체와 사용되지 않는 객체를 구분하기 위해 먼저 GC Roots에서부터 참조를 탐색한다.

 

GC Roots는 다음을 포함한다

  • 스택에 저장된 지역 변수
  • 현재 실행 중인 스레드의 참조
  • 정적 변수
  • 네이티브 코드에서의 참조

GC는 루트부터 시작하여 참조 그래프를 따라가며 도달 가능한 객체를 활성(Reachable) 객체로 표시한다

 

2. 참조 그래프 탐색

모든 GC Roots에서 시작하여 연결된 객체를 탐색하고 활성 객체로 마킹한다.

도달할 수 없는 객체는 가비지로 간주한다

 

3.메모리 정리

가비지로 확인된 객체를 힙에서 제거하고 메모리를 회수한다

 

메모리 해제 방식

  • 해당 메모리 블록을 "비어있음"으로 표시
  • 필요에 따라 메모리를 병합(프래그먼테이션 해소)

 

4. 힙메모리 관리

GC는 힙 메모리를 세대별로 나눠 관리하여 성능을 최적화 한다

 

 

세대별 가비지 수집

객체는 **생명 주기**에 따라 힙 메모리의 세대 영역으로 나뉜다.

  • Young Generation
    새로 생성된 객체가 저장된다
    대부분의 객체는 짧은 생명 주기를 가지므로, Young 영역에서 빠르게 수집된다
    Minor GC라고 한다

  • Old Generation
    Young 영역에서 살아남은 객체가 이동한다
    장시간 사용되는 객체가 저장된다
    Major GC 또는 Full GC라고 한다

  • Permanent Generation
    클래스 메타데이터를 저장하는 영역

Young Generation 내부 동작

1. Eden 영역

  • 새로 성생된 객체는 처음에 Eden 영역에 할당된다

2. Minor GC 발생

  • Eden이 가득 차면 Minor GC가 발생
  • Eden에서 살아남은 객체는 Survivor 영역으로 이동
  • GC루트에서 참조되지 않는 객체는 제거

3. Survivor 영역

  • Survivor 영역의 객체가 일정 횟수의 GC를 지나면 Old 영역으로 이동한다

 

Old Generation 내부 동작

  • Old 영역에서 GC가 발생하면 Major 또는 Full GC가 수행된다
  • Young 영역보다는 느리지만, 힙의 대부분의 공간을 확보한다

 

'Java' 카테고리의 다른 글

[JAVA] 객체가 생성될 때 Stack과 Heap은  (0) 2024.12.09
JAVA Error & Exception  (1) 2024.12.02
JAVA 오토박싱 & 오토언박싱  (0) 2024.12.02
JAVA 캐스팅  (0) 2024.12.02
JAVA JVM(Java Virtual Machine)  (1) 2024.12.02