프로그래밍

Garbage Collector (GC): Java 메모리 관리를 자동화하는 핵심

silbaram 2024. 9. 24. 23:16
728x90

Garbage Collector(가비지 컬렉터)는 Java의 핵심 기능 중 하나로, 개발자가 메모리를 직접 관리하지 않아도 사용하지 않는 객체를 자동으로 정리하여 메모리 누수를 방지하는 역할을 합니다. Java는 자동 메모리 관리를 제공하는 대표적인 언어 중 하나이며, 가비지 컬렉션 덕분에 개발자는 메모리 해제를 신경 쓰지 않아도 됩니다. 이번 글에서는 Garbage Collector가 무엇인지, 어떻게 동작하는지, 그리고 Java 메모리 관리의 전반적인 흐름을 쉽게 설명하겠습니다.


Garbage Collector란?

Garbage Collector는 JVM이 더 이상 사용되지 않는 객체를 자동으로 감지하고, 해당 객체가 차지하고 있는 메모리를 해제하는 기능입니다. 객체는 메모리 상에 저장되지만, 프로그램에서 더 이상 그 객체에 접근하지 않으면 그 객체는 필요 없어지며, 이를 가비지(garbage)라고 부릅니다. Java의 가비지 컬렉터는 이런 가비지 객체들을 주기적으로 찾아서 메모리를 확보합니다.

다시 말해, Java의 Garbage Collector는 자동 메모리 해제 시스템으로, 메모리 관리의 복잡성을 줄여줍니다. 개발자는 객체를 new로 생성하면 되고, 사용하지 않는 객체를 직접 삭제할 필요가 없습니다.


왜 Garbage Collection이 중요한가?

Java는 메모리를 수동으로 관리하지 않는 자동 메모리 관리 언어입니다. 즉, 개발자가 일일이 객체를 생성하고 제거하는 작업을 하지 않아도 됩니다. 하지만 메모리는 한정된 자원이므로, 필요 없어진 객체들이 계속 메모리에 남아 있으면 시스템 성능에 악영향을 미칠 수 있습니다. 이를 방지하기 위해 Garbage Collector는 자동으로 메모리를 정리하여 효율적인 메모리 사용을 보장합니다.

가비지 컬렉션이 없다면, 개발자가 메모리 할당과 해제를 일일이 신경 써야 하며, 메모리 누수(memory leak)나 불필요한 메모리 낭비가 발생할 수 있습니다.


Garbage Collector의 동작 방식

Garbage Collector는 Java 힙 영역에서 더 이상 참조되지 않는 객체를 자동으로 감지하고 제거합니다. GC의 기본 동작 과정은 다음과 같습니다:

  1. 객체 생성
    Java 프로그램에서 객체는 new 키워드를 사용해 생성되며, 생성된 객체는 Heap 영역에 할당됩니다. 이 객체는 생성된 후 메서드나 다른 객체가 참조하고 있을 수 있습니다.

  2. 객체 참조
    프로그램에서 특정 객체를 참조할 때, 그 객체는 "사용 중"인 상태입니다. 이 상태에서는 Garbage Collector가 해당 객체를 제거하지 않습니다.

  3. 참조 소멸
    더 이상 특정 객체를 참조하지 않거나, 참조하는 변수가 스코프를 벗어나면 그 객체는 참조되지 않게 됩니다. 이 상태의 객체는 프로그램에서 쓸모없는 상태로 간주됩니다.

  4. 가비지 수집
    Garbage Collector는 힙 영역에서 참조되지 않는 객체(더 이상 사용되지 않는 객체)를 주기적으로 찾아서 제거합니다. 제거된 객체가 차지하던 메모리는 다시 사용 가능한 상태로 변환되어, 새로운 객체 생성 시 재사용됩니다.


가비지 컬렉션 방식

Java에서는 다양한 가비지 컬렉션 방식이 있으며, 이들은 JVM의 힙 영역을 효율적으로 관리하기 위한 다양한 알고리즘을 사용합니다. 가장 기본적인 두 가지 방식은 다음과 같습니다:

1. Mark and Sweep (마크 앤 스윕)

이 방식은 두 단계로 나뉩니다:

  • Mark 단계: Garbage Collector가 사용 중인 객체(참조되고 있는 객체)를 찾아서 마크합니다. 마크된 객체는 여전히 프로그램에서 사용 중인 것으로 간주됩니다.
  • Sweep 단계: 마크되지 않은, 즉 더 이상 참조되지 않는 객체를 제거하여 메모리를 해제합니다.

2. Generational Garbage Collection (세대별 가비지 컬렉션)

JVM의 힙 메모리는 크게 Young GenerationOld Generation으로 나누어져 있습니다. 세대별 가비지 컬렉션은 객체의 수명을 기준으로 나누어 관리하는 방식입니다.

  • Young Generation: 새롭게 생성된 객체들이 저장되는 공간입니다. Young Generation에서는 Minor GC가 자주 발생하며, 이때 수명이 짧은 객체들이 주로 제거됩니다.

    • Eden 영역: 새로 생성된 모든 객체가 처음 저장되는 영역입니다.
    • Survivor 영역: Eden에서 살아남은 객체들이 이동하는 영역입니다.
  • Old Generation: Young Generation에서 살아남은 오래된 객체들이 저장되는 영역입니다. 이 영역에서는 Major GC 또는 Full GC가 발생하며, 여기서는 수명이 긴 객체가 주로 관리됩니다.

Generational GC는 객체의 수명 주기를 기반으로 메모리를 효율적으로 관리할 수 있는 방식입니다. 젊은 객체는 빠르게 수집하고, 오래된 객체는 덜 빈번하게 수집하여 성능을 최적화합니다.


Minor GC와 Major GC

가비지 컬렉션은 Minor GCMajor GC로 나뉩니다.

  1. Minor GC

    • Young Generation에서 발생하는 가비지 컬렉션입니다. Eden 영역에서 새롭게 생성된 객체 중 더 이상 참조되지 않는 객체를 제거하고, 살아남은 객체는 Survivor 영역으로 이동합니다.
    • Minor GC는 비교적 자주 발생하며, 그 실행 시간이 짧습니다.
  2. Major GC (또는 Full GC)

    • Old Generation에서 발생하는 가비지 컬렉션입니다. 이 과정에서는 Old Generation에서 더 이상 참조되지 않는 객체들이 제거됩니다.
    • Major GC는 Minor GC보다 덜 빈번하게 발생하지만, 실행 시간이 오래 걸리며 시스템 성능에 더 큰 영향을 미칠 수 있습니다.

Stop-the-world 현상

가비지 컬렉션이 발생할 때 JVM은 프로그램의 실행을 일시적으로 정지(stop)시킵니다. 이를 Stop-the-world 현상이라고 하며, Garbage Collector가 메모리를 정리하는 동안 애플리케이션의 모든 쓰레드는 중지됩니다.

Minor GC는 비교적 빠르게 실행되지만, Major GC는 더 많은 객체를 수집하고 메모리 해제를 처리하기 때문에 실행 시간이 길어질 수 있습니다. 이때 Stop-the-world 시간이 길어지면 애플리케이션 성능에 큰 영향을 미칠 수 있습니다. 이를 줄이기 위해 다양한 GC 알고리즘이 발전되어 왔습니다.


Garbage Collector 튜닝 및 JVM 옵션

JVM은 다양한 GC 알고리즘을 지원하며, 필요에 따라 이를 튜닝할 수 있습니다. 몇 가지 대표적인 GC 알고리즘은 다음과 같습니다:

  1. Serial GC

    • 단일 스레드를 사용하여 가비지 컬렉션을 수행합니다. 비교적 단순한 알고리즘이지만, 멀티코어 시스템에서는 성능이 떨어질 수 있습니다.
    • JVM 옵션: -XX:+UseSerialGC
  2. Parallel GC

    • 여러 스레드를 사용하여 가비지 컬렉션을 병렬로 처리합니다. 멀티코어 CPU 환경에서 성능이 개선됩니다.
    • JVM 옵션: -XX:+UseParallelGC
  3. G1 GC (Garbage-First Garbage Collector)

    • Java 9 이후 기본 GC로 사용되는 G1 GC는 전체 힙을 작은 영역으로 나누어 가비지 컬렉션을 수행합니다. Stop-the-world 시간을 최소화하는 데 중점을 둔 알고리즘입니다.
    • JVM 옵션: -XX:+UseG1GC
  4. ZGC (Z Garbage Collector)

    • Stop-the-world 시간을 매우 짧게 유지하는 GC로, Java 11에서 도입되었습니다. 매우 큰 힙을 사용하는 애플리케이션에 적합합니다.
    • JVM 옵션: -XX:+UseZGC

요약

Garbage Collector는 JVM에서 메모리를 자동으로 관리해주는 중요한 기능입니다. 더 이상 사용되지 않는 객체를 감지하여 메모리에서 제거함으로써, 메모리 누수나 성능 저하를 방지하고, 개발자는 메모리 관리에 신경 쓸 필요 없이 애플리케이션 개발에 집중할 수 있습니다.

Garbage Collection은 JVM의 Heap 메모리에서 동작하며, Generational GC를 통해 객체의 수명을 기반으로 메모리를 효율적으로 관리합니다. 또한, 가비지 컬렉션 중 발생하는 Stop-the-world 현상을 최소화하기 위해 다양한 GC 알고리즘이 개발되어 있으며, 애플리케이션에 맞는 GC를 선택하고 튜닝하는 것도 JVM 성능 최적화의

중요한 요소입니다.

Java의 자동 메모리 관리 기능인 Garbage Collector 덕분에, Java는 안정적이고 효율적인 애플리케이션을 개발할 수 있는 강력한 플랫폼으로 자리 잡았습니다.

728x90