[C# 기초강의] Ch 22. 가비지 컬렉션

728x90

 

https://www.youtube.com/watch?v=73yAjdkVhP8&list=PLVsNizTWUw7GN8wPRhclbKuQa9aI9Cj2V&index=23

 

📌 가비지 컬렉션

  • C/C++은 객체에 대한 해제 코드가 필수 (GC없음)
    해제 코드를 누락하는 경우 메모리 누수가 발생하고 프로그램 오류 발생
  • C#은 힙에서 할당한 객체를 CLR이 자동으로 수거
    CLR은 더이상 쓰지 않는 객체는 쓰레기로 판단하여 수거하는데, 수거하는 것이 가비지 컬렉션이다.

 

◾ CLR이 객체를 할당하는 과정

  • CLR은 어플리케이션을 위한 메모리 공간을 통째로 확보
  • 하나의 관리되는 힙을 마련
  • 객체가 할당될 때마다 관리되는 힙에 순차적으로 적재

 

📌 가비지 컬렉션의 과정

◾ GC루트

  • 루트는 힙에 잇는 객체를 붙드는 참조
  • 루트는 a처럼 스택 또는 힙에 생성
  • .NET 어플리케이션 실행 시 JIT 컴파일러는 루트 목록 생성
  • CLR은 이 루트 목록을 관리하며 상태 갱신
    루트 목록은 GC가 참조하는 중요 자료이다.
  • GC는 초기에 모든 객체가 쓰레기라고 가정한다.
  • 루트 목록을 순회하면서 각 루트가 참조하는 힙 객체와 관계를 조사하여, 어떤 힙과도 관계가 없는 경우 쓰레기로 판단한다.
  • 쓰레기 객체가 차지하고 있던 메모리는 비어있는 공간이 된다.
  • 루트 목록에 대한 조사 후 GC는 힙을 순회하며 쓰레기가 차지하고있는 비어있는 공간으로 인접 객체들을 이동하며 정리

 

◾ 세대별 GC

  • CLR은 메모리를 0, 1, 2의 3개 세대로 분리
  • 객체의 나이가 어릴수록 메모리에서 빨리 사라지고, 나이가 많을 수록 메모리에서 오래 살아남는다고 간주
    나이는 가비지컬렉션을 겪은 횟수로 친다.
  • 0세대 : 가비지 컬랙션을 한 번도 겪지 않은 갓 생성된 객체
  • 1세대 : 0세대와 2세대 사이의 과도기에 있는 객체
  • 2세대 : GC을 최소 2회이상 경험
728x90