본문 바로가기
C#

C#의 Garbage Collection (GC) 개념

by 공부봇 2025. 1. 3.
반응형

C#의 Garbage Collection (GC) 개념

Garbage Collection(GC)은 .NET 런타임의 핵심 기능으로, 메모리를 자동으로 관리하여 개발자가 명시적으로 메모리를 해제하지 않아도 되도록 합니다. 이는 메모리 누수(Memory Leak)와 같은 문제를 방지하고, 애플리케이션의 안정성과 성능을 높이는 데 기여합니다.


1. Garbage Collection의 작동 방식

GC는 더 이상 참조되지 않는 객체를 탐지하여 해당 객체가 점유하고 있던 메모리를 회수합니다. 주요 작동 과정은 다음과 같습니다:

  1. 객체 할당
    • 새 객체가 생성되면 관리 힙(Managed Heap)에 메모리가 할당됩니다.
    • 관리 힙은 CLR(Common Language Runtime)에 의해 관리됩니다.
  2. 객체 사용
    • 객체는 메모리에 할당된 상태에서 프로그램에 의해 참조되고 사용됩니다.
  3. Garbage Collection 실행
    • 더 이상 참조되지 않는 객체(즉, 프로그램에서 접근할 수 없는 객체)를 탐지하여 메모리를 해제합니다.

2. 관리 힙(Managed Heap) 구조

관리 힙은 세 가지 세대(Generation)로 나뉩니다:

  1. Generation 0
    • 새로 생성된 객체가 여기에 할당됩니다.
    • 크기가 작고 수명이 짧은 객체가 주로 포함됩니다.
    • GC가 가장 빈번하게 실행됩니다.
  2. Generation 1
    • Generation 0에서 살아남은 객체가 이동됩니다.
    • 임시적으로 사용되는 객체가 포함됩니다.
  3. Generation 2
    • Generation 1에서 살아남은 객체가 이동됩니다.
    • 수명이 긴 객체가 포함됩니다.
    • GC가 가장 적게 실행됩니다.

3. GC의 주요 알고리즘

  1. Mark and Sweep
    • 참조 가능한 객체를 "마크"합니다.
    • 마크되지 않은 객체를 제거하고, 해제된 메모리를 회수합니다.
  2. Compacting
    • 힙의 단편화를 방지하기 위해 객체를 재배치하여 연속된 메모리 공간을 만듭니다.

4. GC가 실행되는 조건

  • 메모리가 부족할 때
    관리 힙에 새 객체를 위한 공간이 부족한 경우.
  • GC.Collect() 호출 시
    강제로 Garbage Collection을 실행하도록 요청할 때 (권장되지 않음).
  • 운영 체제 신호
    시스템 리소스가 부족하다는 신호를 받았을 때.

5. GC의 특징

  1. 자동 메모리 관리
    개발자가 명시적으로 메모리를 해제할 필요가 없습니다.
  2. Generational GC
    객체의 수명 주기에 따라 GC 효율을 최적화합니다.
  3. Stop-the-World
    GC가 실행되는 동안 애플리케이션의 스레드가 일시 중지됩니다. 이로 인해 성능 저하가 발생할 수 있으므로 최적화가 중요합니다.
  4. Finalization
    객체가 GC에 의해 제거되기 전에 Finalize() 메서드를 호출하여 정리 작업을 수행할 수 있습니다.

6. 개발자가 알아야 할 점

  1. IDisposable 인터페이스
    • using 구문과 Dispose() 메서드를 활용하여 비관리 리소스(파일 핸들, 네트워크 연결 등)를 명시적으로 정리해야 합니다.
  2. GC.SuppressFinalize()
    • 객체가 Finalizer를 호출하지 않도록 지정하여 성능을 최적화합니다.
  3. GC.Collect() 사용 자제
    • 필요 이상으로 GC를 강제 실행하면 성능 저하를 초래할 수 있으므로 피해야 합니다.

7. 예제 코드

자동 메모리 관리

class Program
{
    static void Main(string[] args)
    {
        for (int i = 0; i < 10000; i++)
        {
            var obj = new SampleObject(); // 객체 생성
        }
        Console.WriteLine("Garbage Collection은 자동으로 실행됩니다.");
    }
}

class SampleObject
{
    ~SampleObject()
    {
        Console.WriteLine("Finalizer 호출: 메모리 해제 준비");
    }
}

IDisposable 활용

using System;

class Program
{
    static void Main(string[] args)
    {
        using (var resource = new ManagedResource())
        {
            resource.UseResource();
        } // Dispose()가 자동 호출
    }
}

class ManagedResource : IDisposable
{
    public void UseResource()
    {
        Console.WriteLine("리소스 사용 중...");
    }

    public void Dispose()
    {
        Console.WriteLine("리소스 정리 중...");
    }
}

8. Garbage Collection의 이점

  • 메모리 누수 방지
  • 간단한 메모리 관리
  • 복잡한 리소스 정리 문제 해결

하지만 GC는 자동화된 도구일 뿐, 비관리 리소스의 정리는 개발자가 신경 써야 합니다. GC의 동작을 이해하면 효율적인 애플리케이션을 설계할 수 있습니다! 😊

반응형