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() 호출 전에는 생성된 객체들이 메모리를 차지하고 있지만, 호출 후에는 참조되지 않는 객체들이 정리되어 메모리 사용량이 크게 감소하는 것을 확인할 수 있습니다.