
Effective C# Item 11
가비지 컬렉션(GC)과 메모리 관리
프로그램이 사용하지 않는 메모리를 자동으로 해제하는 프로세서
.NET에서는 가비지 컬렉터가 주기적으로 실행되어 더 이상 사용되지 않는 객체를 찾아내고 메모리에서 제거한다.
마크/콤팩트 알고리즘
여러 객체 사이의 연관 관계를 효율적으로 파악하여 더 이상 사용되지 않는 객체를 자동으로 제거한다.마킹
응용프로그램 내의 최상위 객체로부터 참조 트리를 구성하여 도달 가능한 객체를 살아 있는 객체로 판단하고 도달 불가능한 객체를 가비지로 체크하는 과정콤팩팅
마킹이 완료된 후, 사용 중인 객체들을 옮겨 조각난 가용 메모리를 단일의 큰 메모리 공간으로 만드는 과정
비관리 소스
Finalizer
비관리 리소스에 대한 해제 작업이 반드시 수행될 수 있도록 도와주는 방어적인 메커니즘public class CriticalSection { public CriticalSection() { // 초기화 코드 } ~CriticalSetcion() { // 코드 } }Finalizer는 GC에 의해 객체가 제거될 때 호출이되며 명시적으로 호출이 불가능하다.
Finalizer를 사용하면 가비지 수집 과정이 더 길어진다.
Finalizer를 가능한 한 사용하지 않아야 하며 필요한 구조를 회피해야한다.
Dispose 패턴
비관리 리소스를 정리하는 표준화된 패턴
IDisposable 인터페이스를 통해 리소스를 삭제할 수 있는 기능을 안정적으로 제공한다.public class CriticalSection : IDisposable { private bool disposed = false; public CriticalSection() { // 초기화 코드 } // Dispose 메서드를 호출하여 리소스를 명시적으로 해제 public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (disposed) return; if (disposing) { // 관리 리소스 정리 } // 비관리 리소스 정리 diposed = true; } }상세한 내용은 Item 17에서 다룬다.
결론
Finalizer는 응용프로그램의 성능에 심각한 영향을 미치므로 IDisposable 인터페이스를 구현하여 가비지 수집 과정이 지연되는 것을 방지해야 한다.