본문 바로가기
카테고리 없음

가비지 컬렉션(GC, Garbage Collection) 총정리

by sftt 2023. 12. 8.

가비지 컬렉션(GC, Garbage Collection) 총정리

가비지 컬렉션(GC, Garbage Collection)은 메모리 관리 기법 중 하나로, 프로그램에서 동적으로 할당한 메모리 중 사용하지 않는 객체(가비지)를 자동으로 탐지하여 해제하는 과정이다. 이를 통해 개발자는 메모리 관리에 대한 부담에서 해방되고, 메모리 누수 및 다른 메모리 관련 오류의 발생 가능성이 줄어든다.

1. 가비지 컬렉션의 원리

가비지 컬렉션의 가장 기본적인 원리는 가비지 수집기(Garbage Collector)가 동작하는 동안 "Reachability"라는 개념을 기반으로 한다는 것이다. 이 개념은 간단히 말해, 어떤 객체가 다른 객체로부터 직접적이거나 간접적으로 참조되는지를 판단하여, 참조되지 않는 객체를 가비지로 간주하고 메모리에서 해제한다.

주요한 가비지 컬렉션 알고리즘은 다음과 같다.

  • Reference Counting: 객체가 참조되는 횟수를 세어, count가 0이 되면 가비지로 간주한다. 이러한 방식은 쉽게 구현할 수 있으나 순환 참조(객체들이 서로를 참조하여 서로를 계속 가비지로 인식하지 못하는 상황) 문제가 발생할 수 있다.
  • Mark-Sweep: 가비지 컬렉터가 모든 객체를 순회하며 Reachability를 판단하여, 참조되지 않은 객체를 마킹한 뒤, 마킹되지 않은 객체를 가비지로 간주하여 해제하는 방법이다.
  • Copy: 할당한 메모리를 두 개의 구역으로 나누어 사용하고, 한 구역이 가득 차면 Reachability에 따라 사용되지 않는 객체를 제외한 나머지 객체를 다른 구역으로 복사한다.
  • Mark-Compact: Mark-Sweep와 유사한 방식이지만, 가비지를 해제하고 남은 객체들을 한 곳으로 모아 정렬시킨다.

2. 가비지 컬렉션의 장단점

가비지 컬렉션은 다음과 같은 장점을 가지고 있다.

  • 개발자는 메모리 관리에 대한 부담을 덜 수 있다.
  • 메모리 누수와 같은 일반적인 메모리 관련 오류의 발생 가능성이 줄어든다.
  • 프로그램 실행 중에 동적인 메모리 할당과 해제를 할 필요가 없으므로 개발 생산성을 향상시킬 수 있다.

하지만 가비지 컬렉션에는 몇 가지 단점도 존재한다.

  • 가비지 컬렉션 과정은 알 수 없는 시간에 실행되므로, 실시간 응용 프로그램과 같이 지연 시간이 민감한 경우에는 문제가 될 수 있다.
  • 가비지 수집기의 동작으로 인해 프로그램 실행 속도가 느려질 수 있다.
  • 메모리 해제 작업을 처리하는 가비지 수집기는 추가적인 CPU 사용과 메모리 사용을 필요로한다.

3. 가비지 컬렉션의 종류

가비지 컬렉션은 다양한 방식으로 구현될 수 있다. 대표적인 구현 방식으로는 다음과 같은 것들이 있다.

  • Serial GC: 가비지 컬렉션을 단일 스레드로 처리하는 방식이다.
  • Parallel GC: 가비지 컬렉션을 병렬로 처리하고, 여러 개의 스레드를 사용하여 가비지를 수집하는 방식이다.
  • Concurrent GC: 가비지 컬렉션 작업을 일시 중단하지 않고 병행하여 처리하는 방식이다.
  • G1(Garbage First) GC: 큰 힙 메모리 영역을 작은 영역들로 분할해 수집하고, 높은 가비지 비율을 가진 영역을 우선적으로 수집하는 방식이다.

4. 가비지 컬렉션의 최적화 방법

가비지 컬렉션은 메모리 관리에 있어 중요한 역할을 하므로, 최적화 방법을 고려해야 한다. 몇 가지 가비지 컬렉션 최적화 방법은 다음과 같다.

  • 객체의 생존 기간을 고려한 메모리 할당: 객체의 예상 생존 기간을 고려하여 해당 객체에 메모리를 할당할 수 있다.
  • 순환 참조 제거: 객체들 간의 순환 참조를 제거하고, Weak Reference 등을 활용하여 순환 참조 없이 필요한 객체들만 서로 참조하도록 해야 한다.
  • Finalizer 사용 줄이기: Finalizer 메소드는 가비지 컬렉션이 마지막으로 객체를 해제하기 직전에 호출되는데, Finalizer 사용은 성능 문제를 야기하므로 사용을 최소화하는 것이 좋다.

5. 결론

가비지 컬렉션은 자동으로 사용되지 않는 객체를 해제함으로써 프로그래머가 메모리 관리에 대한 일부 부담을 덜어주는 중요한 기술이다. 이를 위해 가비지 컬렉션의 원리, 장단점, 종류와 최적화 방법 등에 대한 이해는 개발자에게 중요하다.

댓글