Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#에서 가비지 수집(GC)을 강제로 실행하는 방법

C#에서는 GC.Collect() 메서드를 호출하여 가비지 수집기(가비지 컬렉터)의 실행을 강제할 수 있습니다.

강제 가비지 수집이 권장되지 않는 이유

다만, 가비지 수집을 강제로 실행하는 것은 일반적으로 좋은 프로그래밍 방식으로 간주되지 않습니다. 강제 수집은 불필요한 성능 오버헤드를 유발할 수 있으며, .NET 런타임은 자체적으로 최적의 수집 시점을 판단하도록 설계되어 있기 때문입니다. 따라서 특별한 사유(메모리 사용량 측정, 벤치마크 등)가 없다면 GC에 맡기는 것이 바람직합니다.

GC.Collect() 메서드의 주요 오버로드

  • Collect() – 모든 세대(generation)에 대해 즉시 가비지 수집을 강제 실행합니다.
  • Collect(Int32) – 0세대부터 지정된 세대까지 즉시 가비지 수집을 강제 실행합니다.

예제 코드

아래 예제는 불필요한 객체를 다수 생성하여 메모리에 가비지를 만든 후, GC.Collect() 호출 전후의 메모리 사용량을 비교하는 코드입니다.

using System;
class MyGCCollectClass
{
    private const int maxGarbage = 1000;

    static void Main()
    {
        // 메모리에 객체들을 생성합니다.
        MyGCCollectClass.MakeSomeGarbage();

        Console.WriteLine("수집 전 메모리 사용량: {0:N0}",
            GC.GetTotalMemory(false));

        // 모든 세대의 메모리를 수집합니다.
        GC.Collect();

        Console.WriteLine("전체 수집 후 메모리 사용량: {0:N0}",
            GC.GetTotalMemory(true));
    }

    static void MakeSomeGarbage()
    {
        Version vt;
        // 객체를 생성하고 해제하여 사용하지 않는 객체로 메모리를 채웁니다.
        for (int i = 0; i < maxGarbage; i++)
        {
            vt = new Version();
        }
    }
}

실행 결과를 보면 GC.Collect() 호출 전에는 생성된 객체들이 메모리를 차지하고 있지만, 호출 후에는 참조되지 않는 객체들이 정리되어 메모리 사용량이 크게 감소하는 것을 확인할 수 있습니다.