기술면접 준비

가비지 컬렉션(Garbage Collection, GC) 이란?

Albosa2lol 2024. 7. 30. 19:36

가비지 컬렉션(Garbage Collection, GC)은 컴퓨터 프로그램에서 더 이상 사용되지 않는 메모리 공간을 자동으로 해제하는 메커니즘입니다. 이는 프로그래머가 명시적으로 메모리를 해제하지 않아도 되도록 하여 메모리 누수를 방지하고, 메모리 관리의 복잡성을 줄여줍니다.

주요 개념

  1. 가비지(Garbage): 더 이상 참조되지 않거나 사용되지 않는 객체를 말합니다. 이러한 객체는 프로그램 실행 중에 필요 없게 된 메모리 공간을 차지합니다.
  2. 힙 메모리(Heap Memory): 객체들이 동적으로 할당되는 메모리 영역입니다. 가비지 컬렉션은 이 힙 메모리에서 불필요한 객체를 식별하고 해제합니다.
  3. 루트 세트(Root Set): 여전히 접근 가능한 객체들을 나타내는 기준점입니다. 일반적으로 스택 변수, 전역 변수, 레지스터 등에 의해 참조되는 객체들이 포함됩니다.

가비지 컬렉션의 동작 방식

가비지 컬렉션은 여러 가지 알고리즘을 사용하여 메모리 관리 작업을 수행합니다. 주요 알고리즘은 다음과 같습니다.

  1. 마크 앤 스윕(Mark and Sweep): 가장 기본적인 가비지 컬렉션 알고리즘입니다.
    • 마크 단계: 루트 세트에서 시작하여 모든 접근 가능한 객체들을 "마크"합니다.
    • 스윕 단계: 힙 메모리 전체를 스캔하여 마크되지 않은 객체들을 해제합니다.
  2. 카피 알고리즘(Copy Algorithm): 힙 메모리를 두 개의 영역(From-space와 To-space)으로 나누어 사용합니다.
    • 사용 중인 영역(From-space)에서 접근 가능한 객체를 새로운 영역(To-space)로 복사합니다.
    • 사용되지 않는 영역을 초기화하여 모든 가비지를 제거합니다.
  3. 참조 카운팅(Reference Counting): 각 객체가 참조되는 횟수를 카운트하여 참조 횟수가 0이 되면 메모리를 해제합니다.
    • 순환 참조 문제로 인해 잘 사용되지 않습니다.
  4. 세대별 가비지 컬렉션(Generational Garbage Collection): 객체의 생애 주기에 따라 메모리 영역을 나누어 관리합니다.
    • Young Generation: 새로 생성된 객체들이 위치하며, 주기적으로 Minor GC가 수행됩니다.
    • Old Generation: Young Generation에서 살아남은 객체들이 이동하며, Major GC가 수행됩니다.
    • Permanent Generation: 클래스와 메서드 같은 메타데이터가 위치합니다(자바 8 이후 Metaspace로 대체).

동작 예시

 

public class GarbageCollectionExample {
    public static void main(String[] args) {
        // 객체 생성
        MyObject obj1 = new MyObject();
        MyObject obj2 = new MyObject();

        // obj1을 null로 설정하여 참조를 해제
        obj1 = null;

        // 가비지 컬렉터를 명시적으로 호출 (권장되지 않음)
        System.gc();

        // obj2는 여전히 참조되고 있으므로 가비지 컬렉터에 의해 해제되지 않음
    }
}

class MyObject {
    @Override
    protected void finalize() throws Throwable {
        // 객체가 가비지 컬렉션에 의해 해제될 때 호출
        System.out.println("Garbage Collected");
    }
}

 

이 예시에서 obj1은 참조를 해제하였기 때문에 가비지 컬렉션의 대상이 됩니다. System.gc()는 가비지 컬렉터를 명시적으로 호출하는 방법이지만, 이는 권장되지 않습니다. 자바 가비지 컬렉터는 JVM에 의해 자동으로 관리됩니다.

가비지 컬렉션의 장단점

장점:

  • 메모리 누수 방지
  • 프로그래머가 메모리 관리를 명시적으로 할 필요가 없음
  • 메모리 관리의 복잡성 감소

단점:

  • 가비지 컬렉션 수행 시 일시적인 성능 저하
  • 가비지 컬렉션 알고리즘에 따라 메모리 해제 지연 가능
  • 예측하기 어려운 메모리 관리 타이밍

가비지 컬렉션은 메모리 관리를 자동화하여 프로그래머의 부담을 줄이고, 프로그램의 안정성을 높이는 중요한 메커니즘입니다.