본문 바로가기
공부/JAVA

자바의 가비지 컬렉터 (Garbage Collector, GC)

by 떈구 2025. 3. 7.

1. 가비지 컬렉터란?

Java는 C++과 달리 명시적으로 메모리를 해제(delete)할 필요가 없다. 대신, 가비지 컬렉터(GC) 가 필요하지 않은 객체를 자동으로 정리해준다.

📌 가비지 컬렉터의 역할

  • 더 이상 사용되지 않는 객체를 자동으로 제거하여 메모리 누수를 방지.
  • 메모리를 효율적으로 관리하여 프로그램이 안정적으로 실행되도록 유지.
  • 스택(Stack) 메모리는 직접 정리되지만, 힙(Heap) 메모리는 GC가 관리.

2. 가비지 컬렉터의 동작 순서 (프로그램 실행 단위 기준)

  1. 객체 생성: 프로그램 실행 중 new 키워드를 사용하여 객체를 생성함.
  2. 객체 참조 관리: 생성된 객체는 변수나 필드에 의해 참조됨.
  3. 참조 여부 검사 (Mark 단계): GC가 실행되면 각 객체가 현재 사용 중인지 확인함.
  4. 사용되지 않는 객체 식별 (Sweep 단계): 더 이상 참조되지 않는 객체를 찾고 삭제함.
  5. 메모리 단편화 정리 (Compaction 단계, 필요시 수행): 메모리 조각화를 방지하고 새로운 객체가 저장될 공간을 확보함.
  6. 정리 완료 후 프로그램 계속 실행: GC가 완료되면 프로그램은 정상적으로 실행을 이어감.

📌 GC 실행 과정은 C++의 컴파일 과정 (전처리기 → 컴파일러 → 어셈블러 → 링커)과 유사한 단계적 처리 방식으로 동작함.


3. GC의 주요 단계 상세 설명

📌 1. 참조 여부 검사 (Mark 단계)

  • GC가 실행되면, 모든 객체를 검사하여 현재 사용 중인지 여부를 확인한다.
  • 루트(root) 객체에서부터 탐색을 시작하여, 직접적으로 또는 간접적으로 참조되는 객체를 "사용 중"으로 표시한다.
    • 루트 객체란?
      • 스택(Stack) 변수 (예: main() 메서드 내의 지역 변수)
      • 정적(static) 변수
      • 활성화된 쓰레드에서 참조하는 객체
  • 사용 중인 객체는 "Mark(표시)"되며, 사용되지 않는 객체는 표시되지 않음.

📌 2. 사용되지 않는 객체 식별 (Sweep 단계)

  • Mark되지 않은 객체를 찾아서 메모리에서 제거하는 단계.
  • 사용되지 않는 객체는 더 이상 어떤 변수에서도 참조하지 않는 상태이므로 삭제 대상이 됨.
  • JVM은 이 단계를 통해 불필요한 메모리를 회수하여 새로운 객체를 위한 공간을 확보한다.

📌 3. 메모리 단편화 정리 (Compaction 단계, 필요시 수행)

  • GC가 객체를 삭제하면 힙 메모리에 "빈 공간(구멍)"이 생길 수 있음.
  • 이러한 단편화(fragmentation)를 방지하기 위해 남아 있는 객체들을 한 곳으로 모아 재정렬(Compaction)하는 과정.
  • 이 단계가 필요하지 않다면 수행되지 않으며, 힙 메모리를 효율적으로 사용하기 위해 필요할 때만 수행됨.

📌 정리하면?

단계설명

Mark 단계 사용 중인 객체를 식별하여 "살아 있는 객체"로 표시
Sweep 단계 Mark되지 않은 객체(사용되지 않는 객체)를 삭제
Compaction 단계 메모리를 정리하여 단편화된 공간을 제거하고 새로운 객체를 위한 공간 확보

4. GC가 제거하는 대상 예제

class Person {
    String name;

    Person(String name) {
        this.name = name;
    }
}

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person("Alice");
        p1 = new Person("Bob");  // 기존 객체(Alice)는 GC 대상이 됨

        System.gc(); // 명시적으로 GC 실행 요청 (보장되지 않음)
    }
}

📌 "Alice" 객체는 더 이상 참조되지 않으므로, GC에 의해 제거될 수 있음.


5. GC의 주요 알고리즘

GC 알고리즘 특징
Mark and Sweep 사용되지 않는 객체를 찾아 제거
Generational GC 객체를 세대(Young, Old)로 나누어 관리
Reference Counting 참조 개수를 이용하여 객체 제거

📌 System.gc();를 호출하면?

  • GC 실행을 요청하지만 보장되지 않음.
  • JVM이 GC 실행 여부를 결정하므로 즉시 실행되지 않을 수도 있음.

6. 정리

  1. 가비지 컬렉터(GC)는 힙(Heap)에서 사용되지 않는 객체를 자동으로 제거함.
  2. GC는 참조가 없는 객체를 찾고 제거하며, 메모리 정리를 수행하여 단편화를 방지함.
  3. GC는 단계적 처리 방식(객체 생성 → 참조 관리 → GC 실행 → 단편화 정리 → 프로그램 지속 실행)으로 동작함.
  4. System.gc();를 호출해도 즉시 실행이 보장되지 않으며, JVM이 GC 실행을 결정함.
  5. static 변수는 GC의 대상이 되지 않으며, 프로그램 종료 시까지 유지됨.

Java의 가비지 컬렉터를 이해하면 더 효율적인 프로그램을 작성할 수 있다! 🚀


 

'공부 > JAVA' 카테고리의 다른 글

자바의 클래스 (Java Class)  (1) 2025.03.07
자바의 변수와 메서드(함수)  (0) 2025.03.07
Java의 입출력  (1) 2025.03.05
자바의 시작 - 프로그램 셋팅 및 헬로우 월드  (0) 2025.03.05