스터디/CS

[CS] Garbage Collection

kwang2134 2025. 3. 25. 10:36
728x90
반응형
728x90

1. 가비지 컬렉션 (Garbage Collection) 이란?

프로그램에서 더 이상 사용되지 않는 메모리를 자동으로 회수하여 메모리 관리를 효율적으로 수행하는 기술

2. 왜 필요한가?

  • 메모리 누수 방지: 수동 메모리 관리 시 발생할 수 있는 메모리 누수를 자동으로 관리해 방지
  • 메모리 안전성: 개발자가 메모리 주소를 직접 관리할 필요가 없어 잘못된 메모리 접근이나 해제로 인한 오류가 줄어듬
  • 생산성 향상: 메모리 관리에 대한 부분을 개발자가 고려하지 않아도 됨

3. 동작 방식

주로 mark-and-sweep 알고리즘을 기반으로 수행 → Mark, Sweep 단계로 나뉨

  1. Mark Phase: 프로그램의 루트 객체에서 시작하여 이 객체들이 참조하는 모든 객체를 표시 → 모든 참조 가능한 객체 식별
  2. Sweep Phase: 표시되지 않은 객체는 더 이상 사용되지 않는 것으로 간주하고 해당 메모리를 회수 → 메모리 공간 해제
  3. Compaction: 메모리 단편화를 줄이고 연속된 메모리 블록을 생성하여 향후 할당을 효율적으로 수행
    1. Sweep 단계가 수행된 후 메모리에 사용되지 않은 객체가 제거되며 빈 공간이 생김
    2. 빈 공간이 메모리 여기저기 흩어진 경우 큰 객체 할당 시 문제 발생 가능 → 메모리에 충분한 공간이 있으나 연속된 공간이 부족하여 할당이 불가능한 경우
    3. Compaction 단계를 통해 살아남은 객체들을 메모리 한쪽 끝으로 옮겨 빈 공간을 하나의 큰 블록으로 변경 → 메모리 할당이 더 효율적으로 이루어질 수 있음

가비지 컬렉션 주요 영역

  • Eden: 새로운 객체가 생성되는 영역
    • Young Generation의 일부로 객체가 새로 생성되는 경우 시작하는 곳
    • 가득찬 경우 Minor GC 발생
  • Survivor 0 (S0) & Survivor 1 (S1): Eden에서 Minor GC 후 살아남은 객체가 이동하는 영역
    • 두 영역 중 하나는 항상 비어있어야 함
    • Young Generation의 일부로 여러 번 Minor GC를 살아남으면 Age가 증가하고 임계 값 도달 시 Old Generation으로 이동
  • Old Generation (Tenured Space): Young Generation에서 살아남은 객체가 Promotion 되어 이동하는 영역
    • Major GC가 발생하는 영역
    • Young Generation 보다 크고 GC가 덜 발생
    • GC 발생 시 성능에 영향을 줄 수 있음
  • Metaspace: 네이티브 메모리를 사용하여 클래스 메타데이터 저장
    • 메모리가 부족할 경우 자동으로 늘어남

가비지 컬렉션 종류

  • Minor GC: Young Generation에서 발생하며 주로 생성된 객체가 소멸될 때 수행 → 비교적 짧은 시간 내 완료
  • Major GC(Full GC): Old Generation에서 발생하며 모든 힙 메모리를 스캔하여 사용되지 않는 객체 제거 → Minor GC에 비해 많은 시간 소요

가비지 컬렉션 알고리즘

  • Serial GC: 싱글 쓰레드로 GC 수행 → 적은 메모리와 CPU 코어 수에 적당한 방식
  • Parallel GC: 여러 쓰레드로 GC를 병렬로 수행 → 충분한 메모리와 CPU 코어 수를 갖춘 환경에서 유리한 방식
  • Concurrent Mark-and-Sweep(CMS) GC: 애플리케이션 실행과 동시에 GC를 수행하여 중단 시간을 줄이는 방식
  • Garbage-First(G1) GC: heap을 region으로 나누어 관리하며 쓰레기가 많은 region에 우선 실행하는 방식
  • Z GC: 대용량 메모리에서도 중단 시간을 최소화하는 방식
  • Incremental Collection**:** GC 작업을 작은 단위로 수행 → 애플리케이션 중단 시간을 최소화
728x90

'스터디 > CS' 카테고리의 다른 글

[CS] Java String, StringBuilder, StringBuffer 차이  (0) 2025.03.28
[CS] 자바 문자열 할당 방식  (0) 2025.03.27
[CS] 객체 지향 프로그래밍 특징  (0) 2025.03.26
[CS] JVM 구조  (0) 2025.03.14
[CS] Java 실행 과정  (0) 2025.03.12