Unity 내일배움캠프 TIL 1030 | 가비지 컬렉터(GC)

cheeseonrose·2023년 10월 30일
0

Unity 내일배움캠프

목록 보기
66/89
post-thumbnail

💡 가비지 컬렉터

🦝 정의

  • 애플리케이션의 메모리 할당 및 해제를 관리하는 자동 메모리 관리자
  • 자동 메모리 관리를 통해 메모리가 낭비되거나, 이미 메모리가 해제된 개체에 접근하는 것을 방지
  • CLR에 의해 제공
    • CLR(Common Language Runtime) : 코드를 실행하며 개발 과정을 더 쉽게 해주는 서비스를 제공
      -> 우리가 작성한 소스 코드를 OS 위에 있는 .NET Framework에서 작동하게 해주는 역할

🦊 장점

  • C/C++에서는 프로그래머가 직접 가비지 컬렉터 기능을 수행해야 한다.
    • new/malloc을 사용해 동적으로 메모리를 할당한 객체는 사용 후 delete/free로 해제
      -> 메모리 단편화 현상 발생 가능
    • 메모리 단편화(Memory Fragmentation) : 사용 가능한 메모리가 충분히 존재하지만, 할당(사용)이 불가능한 상태
  • C#에서는 가비지 컬렉터가 가비지 컬렉션 이후 자동으로 메모리 컴팩션을 수행하여 메모리 단편화 현상을 방지한다.
    • 메모리 컴팩션(Memory Compaction) : 동적으로 시스템을 구성하는 기억 장소에서 여러 곳에 흩어져 있는 가용 공간을 하나의 연속된 공간으로 만드는 작업

🐼 단점

  • 어떤 메모리를 해제할지 결정하는 데 비용이 발생한다.
  • 가비지 컬렉션이 일어나는 타이밍을 예측하기 어려우며, 정확한 메모리 해제 시점을 알 수 없다.

🐯 회피 전략

  1. 너무 많은 객체를 할당하지 않는다.
  2. 참조 관계를 최소화한다.
    • 참조 관계가 복잡해지면 힙에 메모리가 남을 확률 증가
      -> 가비지 컬렉터 호출 확률 증가
    • 가비지 컬렉션 이후 메모리 주소가 변경될 때, 해당 객체와 참조 관계에 있는 주소를 전부 변경해야 하므로 오버헤드 발생 가능성 증가
  3. 너무 큰 객체의 할당은 자제
    • 힙 상의 객체는 생존 시간에 따라 0, 1, 2세대로 구분
    • 0세대 : 최근 생성된 객체
      1세대 : 1회 이상의 가비지 컬렉션 이후 힙에 남아있는 객체
      2세대 : 2회 이상의 가비지 컬렉션 이후 힙에 남아있는 객체
    • 매우 큰 객체를 할당하게 되면 2세대 힙 객체로 간주되어, 가비지 컬렉션이 자주 발생할 수 있음



출처 - Microsoft 가비지 수집 기본 사항
출처 - Microsoft CLR(공용 언어 런타임) 개요
출처 - CLR (Common Language Runtime) 이란?
출처 - 메모리 단편화(Memory Fragmentation)가 무엇이고 왜 발생하는가?
출처 - [C#] GC 가비지 컬렉션
출처 - [C#] 가비지 컬렉터
출처 - C# GC의 이해 및 메모리 최적화



끗!!

0개의 댓글