본문 바로가기

GC

C# Garbage Collector 동작 원리와 세대별 수집 C#에서 메모리 관리는 Garbage Collector(GC)를 통해 자동으로 이루어집니다. GC는 개발자가 직접 메모리를 해제하지 않아도 되도록 도와주며, 프로그램의 안정성과 효율성을 높여줍니다.1. Garbage Collector 기본 동작 원리GC는 힙 영역에서 사용하지 않는 객체를 탐색하고 회수합니다. .NET 런타임이 주기적으로 실행하여 접근 불가능한 객체를 찾아 메모리를 회수하는 방식입니다. 이 과정은 애플리케이션의 일시 정지(stop-the-world)를 유발하므로 최소한으로 실행하도록 설계되어 있습니다.2. 세대별 수집(Generation Collection)GC는 객체의 수명에 따라 세대(Generation)를 나누어 관리합니다. 이는 젊은 객체는 짧은 시간 내에 소멸하는 반면, 오래된 .. 더보기
C# 값 튜플(ValueTuple) vs Tuple 성능 비교 ValueTuple은 구조체, Tuple은 클래스입니다. 이 한 줄이 성능 차이의 대부분을 설명합니다. 구조체인 ValueTuple은 스택 또는 포함하는 객체 내부에 저장되어 할당과 GC 비용이 적고, 클래스인 Tuple은 힙 할당과 GC 압력이 발생합니다. 실용적인 관점에서 둘의 속도, 메모리 차이를 간단한 코드와 함께 정리합니다.1. 핵심 차이 요약- ValueTuple: 구조체(struct), 필드가 공개이며(mutability) 이름 지정과 분해 할당 지원, 일반적으로 할당 없음(escape 시 제외), 빠름.- Tuple: 참조형(class), 불변(immutable), 항상 힙 할당, GC 대상, Item1/Item2 등만 제공, 느림.- 성능 포인트: 작은 데이터(예: 2~3개 값) 왕복 시.. 더보기
C# 메모리 누수 방지를 위한 약한 참조(WeakReference) 사용 관리되는 환경에서도 긴 수명의 참조(캐시, static 필드, 이벤트 구독 등)가 객체 수명을 불필요하게 연장하면 메모리 누수가 발생합니다. 이 글에서는 약한 참조(WeakReference)를 활용해 GC가 객체를 수거할 수 있도록 허용하면서, 필요할 때만 강한 참조를 복원하는 실용 패턴을 정리합니다.1. WeakReference란?WeakReference는 대상 객체를 참조하되 GC가 수거하는 것을 막지 않는 참조입니다. 코드가 대상에 대한 강한 참조를 유지하지 않는다면, GC는 메모리 압박 시 해당 객체를 언제든지 회수할 수 있습니다. C#에서는 제네릭 버전인 WeakReference 사용을 권장합니다.2. 기본 사용법WeakReference는 대상이 아직 살아 있으면 TryGetTarget으로 강한.. 더보기
C# 생성자와 소멸자 생성자와 소멸자는 객체의 시작과 끝을 책임지는 핵심 요소입니다. 생성자는 초기화 로직을, 소멸자(파이널라이저)는 비관리 자원 정리를 다룹니다. 실무에서는 Dispose 패턴과 함께 올바르게 사용하는 것이 중요합니다.1. 기본/매개변수 생성자클래스에 생성자를 하나도 정의하지 않으면 컴파일러가 매개변수 없는 기본 생성자를 제공합니다. 하나라도 정의하면 기본 생성자는 자동으로 생성되지 않습니다.public class Person{ public string Name { get; } public int Age { get; } // 기본 생성자 public Person() { Name = "Unknown"; Age = 0; } // 매개변수 생성자 .. 더보기