GC

최정훈·2024년 9월 27일

Garbage Collector

메모리 관리를 담당하는 시스템 또는 프로그램의 구성요소. 메모리에서 더 이상 사용되지 않는 객체를 찾아 제거하여 메모리를 회수하는 역할을 수행한다.

Garbage Collection

메모리 관리기술 중 하나로 가비지 컬랙터에 의해 수행되는 프로세스를 의미한다. 가비지 컬랙션은 프로세스 자체를 말하고, 실제 역할을 수행하는 주체는 가비지 컬랙터이다.

  • 유니티는 Mono 프로젝트를 기반으로 돌아간다. 이는 오픈소스 개발자들이 다양한 OS에서 NET Framework를 사용하기 위해 만든 프로젝트이다. 이 덕분에 유니티는 다양한 멀티 플랫폼을 지원하고, 다양한 환경에서 개발이 가능하다. 이 Mono가 런타임 시스템에서 자동으로 메모리 관리를 수행
  • 메모리는 기본적으로는 heap공간에 할당됨.
  • 프로그램에서 필요한 메모리가 있을 경우, 미사용 힙 영역을 제공해야 한다. 메모리 관리자가 특정상황에 따라서 유효하지 않는 영역을 정리하는데, 이렇게 메모리를 파악하고 관리하는 프로세스가 GC(Garbage Collection)이다.

Unity & .Net의 GC

  • .NET Mark and Sweep 알고리즘을 사용한다.
    • Root에서부터 사용하는 객체들을 타고 가면서 사용하는 객체들을 mark하고, 이후 mark되지 않은 객체들을 전부 제거한다.

      세대(Generation) 방식을 사용한다. 할당된 메모리별로 0~2세대를 부여하여, 최적의 타이밍에 필요한 메모리를 해제할 수 있도록 관리한다.

      힙 영역을 SOH(Small Object Heap)과 LOP(Large Object Heap)으로 구분하여, 큰 메모리를 할당하고 해체할 때의 부담을 줄인다.

      매모리 재정렬은 SOH에서만 일어난다.

  • Unity 유니티는 기본적으로 Boehm-Demers-Weiser 알고리즘을 사용한다.
    • Stop the World 방식. 수행할 때마다, 실행 중인 프로그램을 중지하고 작업이 완료된 후에 실행을 재개하기 때문에, 프레임 드랍이 생길 수 있다.

    • GC가 수행되는 동안에는 모든 객체의 참조 관계를 추적하고 유효한(reachable) 객체들과 그렇지 않은(unreachable) 객체들을 식별하여 메모리를 회수해야한다. 이 작업은 매우 느리기 때문에, stop the world를 통해 일시적으로 애플리케이션을 멈추고 추적 작업을 수행한다.

      Mark and Sweep이지만, 세대구분과 매모리 재정렬이 없다.

      Unity 19버전 이상에서는 점진적 GC를 도입하였다.

profile
게임개발자(희망)의 공부일지

0개의 댓글