가비지 컬렉터(Garbage Collector)에 대해 알아보자!

현정재·2024년 6월 17일
0

가비지 컬렉터(Garbage Collector)

가비지 컬렉터(Garbage Collector, GC)는 프로그래밍 언어에서 메모리 관리를 자동화하는 시스템입니다. GC는 더 이상 사용되지 않는 객체나 데이터를 식별하고, 이를 자동으로 해제하여 메모리를 회수합니다. 이를 통해 메모리 누수를 방지하고, 개발자가 메모리 관리에 신경 쓰지 않고 애플리케이션 로직에 집중할 수 있게 합니다.

가비지 컬렉터의 필요성

1. 메모리 누수 방지

프로그램이 더 이상 필요로 하지 않는 객체를 해제하지 않으면 메모리 누수가 발생합니다. 메모리 누수는 시스템의 성능을 저하시키고, 결국에는 메모리 부족으로 인해 프로그램이 충돌하거나 비정상적으로 종료될 수 있습니다.

2. 개발자 편의성

GC를 사용하면 개발자가 명시적으로 메모리를 해제할 필요가 없으므로, 메모리 관리와 관련된 버그를 줄이고 코드 작성에 집중할 수 있습니다.

3. 프로그램 안정성

자동 메모리 관리는 수동 메모리 관리에서 흔히 발생하는 잘못된 메모리 해제, 이중 해제, 해제 후 접근 등의 문제를 방지하여 프로그램의 안정성을 높입니다.

가비지 컬렉터의 방식

1. 참조 카운팅(Reference Counting)

참조 카운팅은 각 객체가 참조되는 횟수를 세고, 참조 카운트가 0이 되면 객체를 해제하는 방식입니다.

장점

  • 즉각적인 메모리 해제가 가능합니다.
  • 구현이 비교적 간단합니다.

단점

  • 순환 참조 문제를 해결하지 못합니다. 순환 참조는 두 객체가 서로를 참조하여 참조 카운트가 0이 되지 않는 상황을 말합니다.
  • 성능이 떨어질 수 있습니다. 객체의 참조가 자주 변경되는 경우, 참조 카운트를 업데이트하는 데 시간이 소요됩니다.

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

마크 앤 스윕은 프로그램의 루트에서 시작하여 모든 도달 가능한 객체를 마크하고, 마크되지 않은 객체를 해제하는 방식입니다.

과정

  • 마크 단계: 루트에서 시작하여 도달 가능한 모든 객체를 방문하고 마크합니다.
  • 스윕 단계: 힙을 검사하여 마크되지 않은 객체를 해제합니다.

장점

  • 순환 참조 문제를 해결할 수 있습니다.
  • 힙 전체를 주기적으로 청소하므로 메모리 단편화(fragmentation)를 줄일 수 있습니다.

단점

  • 전체 힙을 검사하는 과정에서 일시적인 성능 저하가 발생할 수 있습니다.
  • 실시간 애플리케이션에서 사용하기 어려울 수 있습니다.

3. 제너레이션(Generation)

제너레이션 GC는 객체를 생성된 시기에 따라 여러 세대(generation)로 나누어 관리하는 방식입니다. 일반적으로 젊은 세대와 오래된 세대로 나눕니다.

과정

  • 젊은 세대(G1): 객체가 처음 생성될 때는 젊은 세대에 할당됩니다. 젊은 세대는 주기적으로 검사하여 짧은 수명의 객체를 빠르게 수거합니다.
  • 오래된 세대(G2): 젊은 세대를 여러 번 거쳐 살아남은 객체는 오래된 세대로 이동합니다. 오래된 세대는 덜 자주 검사하여 성능을 최적화합니다.

장점

  • 객체의 수명이 짧다는 가정하에 젊은 세대 객체를 빠르게 수거하여 성능을 향상시킬 수 있습니다.
  • 메모리 단편화를 줄이고, 메모리 관리의 효율성을 높입니다.

단점

  • GC의 복잡성이 증가합니다.
  • 잘못된 튜닝으로 인해 성능 저하가 발생할 수 있습니다.

추가적인 가비지 컬렉션 기법

1. 복사 수집(Copying Collection)

힙을 두 개의 반으로 나누고, 한 쪽에서 객체를 할당합니다. 가비지 컬렉션이 필요할 때, 살아있는 객체를 다른 반으로 복사하고 현재 반을 비웁니다.

장점

  • 메모리 단편화를 방지할 수 있습니다.
  • 객체 복사가 효율적일 수 있습니다.

단점

  • 사용 가능한 메모리가 절반으로 줄어듭니다.
  • 객체를 복사하는 비용이 발생합니다.

2. 마크 앤 컴팩트(Mark and Compact)

마크 앤 스윕의 변형으로, 스윕 단계에서 살아있는 객체를 한쪽으로 몰아서 힙을 압축합니다.

장점

  • 메모리 단편화를 줄일 수 있습니다.
  • 힙의 연속적인 사용이 가능해집니다.

단점

  • 객체를 이동하는 데 비용이 발생합니다.
  • 구현이 복잡할 수 있습니다.

GC와 성능

가비지 컬렉션은 프로그램의 성능에 영향을 미칠 수 있습니다. GC가 실행되는 동안 애플리케이션의 다른 작업이 일시 중단될 수 있으며, 이를 GC 중단(GC pause)라고 합니다. 이러한 중단을 줄이기 위해 다양한 최적화 기법이 사용됩니다.

1. 동시성 GC(Concurrent GC)

GC 작업을 애플리케이션의 실행과 동시에 수행하여 중단 시간을 줄입니다. 대표적인 동시성 GC로는 Java의 G1(Garbage-First) GC가 있습니다.

2. 병렬 GC(Parallel GC)

여러 CPU 코어를 활용하여 GC 작업을 병렬로 수행하여 성능을 향상시킵니다.

3. 인크리멘털 GC(Incremental GC)

GC 작업을 여러 단계로 나누어 애플리케이션의 중단 시간을 줄입니다.

결론

가비지 컬렉터는 메모리 관리의 자동화를 통해 개발자의 생산성을 높이고 메모리 누수를 방지하는 중요한 역할을 합니다. 다양한 GC 기법들이 있으며, 각각의 장단점을 이해하고 사용 환경에 맞는 GC를 선택하는 것이 중요합니다. GC의 성능 최적화를 위해 다양한 기법들이 사용되며, 이를 통해 애플리케이션의 안정성과 효율성을 높일 수 있습니다.

profile
wonttock

0개의 댓글