본문 바로가기

언어/Java

[ 자바 / Java ] 가비지 컬렉션(Garbage Collection)으로 메모리 관리하기

반응형

JVM(Java Virtual Machine)에서 Garbage Collection(가비지 컬렉션, GC)은 더 이상 사용되지 않는 객체를 자동으로 메모리에서 제거하여 메모리 누수를 방지하고, 메모리 관리를 효율적으로 수행하는 중요한 기능입니다. 가비지 컬렉션이 일어나는 기준과 메커니즘을 이해하는 것은 자바 프로그램의 성능 최적화와 메모리 관리에 매우 중요합니다.

1. Garbage Collection의 기본 개념

가비지 컬렉션은 JVM이 메모리에서 사용되지 않는 객체를 자동으로 식별하고 회수하는 프로세스입니다. 자바 개발자는 메모리 할당을 명시적으로 관리할 필요가 없으며, GC가 이를 대신 처리합니다. GC는 주기적으로 메모리를 검사하여 가비지가 된 객체를 수집하고 메모리를 회수합니다.

2. 가비지 컬렉션이 일어나는 주요 기준

  1. 객체가 더 이상 참조되지 않을 때:
    • 자바의 객체는 힙(heap) 메모리에 할당되며, GC는 더 이상 참조되지 않는 객체를 수집 대상으로 간주합니다. 더 이상 참조되지 않는 객체는 "가비지"로 간주됩니다.
    • 예를 들어, 스코프(scope) 밖으로 벗어난 변수나 null로 설정된 참조는 가비지 컬렉션의 대상이 됩니다.
  2. 힙 메모리 부족:
    • JVM은 힙 메모리가 부족할 때 GC를 트리거합니다. 힙 메모리가 거의 다 사용되면, GC는 새로운 메모리 할당을 위해 공간을 확보하려고 시도합니다.
    • 메모리 부족 시 GC가 실행되면서 메모리 사용률을 줄이고, 새로운 객체를 위한 공간을 확보합니다.
  3. 명시적인 시스템 호출:
    • System.gc() 메서드를 호출하면 GC 실행을 요청할 수 있습니다. 그러나 이 호출이 실제로 GC를 실행할지 여부는 JVM에 의해 결정됩니다. 따라서 명시적인 호출은 GC 실행을 보장하지 않습니다.

3. GC 작업의 단계

GC 작업은 일반적으로 다음과 같은 단계를 거쳐 수행됩니다:

  1. 마크(Mark):
    • GC는 힙을 스캔하여 더 이상 참조되지 않는 객체를 식별합니다.
    • 이 단계에서 살아 있는 객체는 "마크"되며, 나머지는 가비지로 간주됩니다.
  2. 스윕(Sweep):
    • 마크되지 않은 객체는 메모리에서 제거됩니다.
    • 이 단계에서 사용되지 않는 메모리 블록이 해제됩니다.
  3. 컴팩트(Compact):
    • (선택 사항) 메모리의 단편화를 줄이기 위해 살아남은 객체를 한쪽으로 이동시켜 연속된 메모리 블록을 만듭니다.
    • 이 단계는 Major GC 또는 Full GC에서 자주 수행됩니다.

4. GC 동작 확인 및 튜닝

  • GC 로그:
    • JVM의 GC 동작을 분석하기 위해 GC 로그를 활성화할 수 있습니다. 이는 JVM 시작 시 -Xlog:gc* 옵션을 사용하여 활성화할 수 있습니다.
    • GC 로그는 가비지 컬렉션의 빈도, 소요 시간, 메모리 사용량 등을 보여줍니다.
  • GC 튜닝:
    • JVM 옵션을 통해 GC 동작을 튜닝할 수 있습니다. 예를 들어, -Xms-Xmx 옵션을 사용하여 힙 메모리 크기를 설정할 수 있습니다.
    • 애플리케이션의 특성에 맞는 GC 알고리즘을 선택하고, 필요한 경우 추가적인 JVM 플래그를 설정하여 성능을 최적화할 수 있습니다.

5. 요약

가비지 컬렉션은 자바 애플리케이션의 메모리 관리를 자동화하고, 더 이상 사용되지 않는 객체를 제거하여 메모리 효율성을 높이는 중요한 메커니즘입니다. GC가 언제 발생하는지, 그리고 각 GC 알고리즘이 어떻게 동작하는지를 이해하면 애플리케이션의 성능을 개선하고 메모리 사용을 최적화하는 데 큰 도움이 됩니다.

반응형