본문 바로가기
CSharp/CShap Tip

WeakReference로 캐시 객체의 수명 안전하게 관리하기

by MonoSoft 2025. 10. 20.
728x90
반응형

WeakReference로 캐시 객체의 수명 안전하게 관리하기

 

C#의 **WeakReference**는 GC(가비지 컬렉터)가 객체를 수거할 수 있도록 허용하면서,
동시에 그 객체에 약한 참조(Weak Reference) 를 유지할 수 있는 기능입니다.

일반 참조(strong reference)는 객체를 메모리에 계속 유지시키지만,
약한 참조는 메모리 압박이 생기면 GC가 수거 가능하게 만들어줍니다.

캐시 시스템, 이미지 뷰어, 또는 대량 객체를 임시로 유지해야 하는 시나리오에서 유용합니다.

using System;

class HeavyData
{
    public int[] Data = new int[1_000_000];
}

class Program
{
    static void Main()
    {
        var data = new HeavyData();
        var weakRef = new WeakReference<HeavyData>(data);

        Console.WriteLine("초기 객체 상태: " + (weakRef.TryGetTarget(out _) ? "유효" : "수거됨"));

        // 강한 참조 제거
        data = null;
        GC.Collect(); // 강제 GC 실행

        Console.WriteLine("GC 후 객체 상태: " + (weakRef.TryGetTarget(out _) ? "유효" : "수거됨"));

        // 필요 시 다시 접근
        if (weakRef.TryGetTarget(out var cached))
        {
            Console.WriteLine("캐시 객체 접근 성공: " + cached.Data.Length);
        }
        else
        {
            Console.WriteLine("객체는 이미 수거됨");
        }
    }
}

WeakReference는 GC가 수거를 허용하므로, 
항상 TryGetTarget으로 유효성 검사 후 사용해야 합니다.

너무 자주 사용하면 예기치 않게 객체가 GC에 의해 제거될 수 있습니다.

자주 재생성되는 객체의 경우 WeakReference보다 
Object Pooling이 더 효율적일 수 있습니다.

캐시 데이터는 “있으면 쓰고, 없으면 새로 만든다”는 
전략으로 설계하는 것이 안정적입니다.

이미지 뷰어 / 문서 뷰어: 최근 본 이미지를 
WeakReference로 보관해 메모리 절약.

AI 모델 캐시 / 대용량 데이터 처리: 모델을 메모리 내에 유지하되 
필요 시 GC가 해제 가능하도록 구성.

WPF 또는 WinForms 앱: 이미지나 썸네일 등 
큰 리소스를 임시 캐싱할 때 유용.

.NET 6 이상에서는 ConditionalWeakTable<TKey, TValue>를 사용하면 
객체 수명과 관계된 안전한 연결 가능.

MemoryCache와 WeakReference를 함께 활용하면 
효율적인 자동 메모리 관리 캐시 구현 가능.

서버 애플리케이션에서는 WeakReference + Lazy 로딩으로 
부하를 분산할 수 있습니다.

 


#CSharp #dotnet #WeakReference #GC #메모리관리 #ObjectPooling #성능최적화 #MemoryCache #가비지컬렉션 #캐시

728x90
반응형

댓글