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 #가비지컬렉션 #캐시
'CSharp > CShap Tip' 카테고리의 다른 글
| ref struct로 스택 전용 구조체로 메모리 효율 극대화하기 (0) | 2025.11.03 |
|---|---|
| 문자열 보간기(Interpolated String Handler)로 포매팅 성능 최적화하기 (0) | 2025.10.28 |
| ValueTask로 메모리 효율적인 비동기 처리하기 (0) | 2025.10.16 |
| ValueTask로 메모리 효율적인 비동기 처리하기 (0) | 2025.10.15 |
| 병렬 처리: TParallel.For 활용하기 (0) | 2025.10.13 |
댓글