내가 일하며 알게 된 프로그래밍
article thumbnail

가비지 컬렉터란?

메모리 관리 기법 중의 하나로, 동적으로 할당한 메모리 영역 중 더 이상 쓰이지 않는 영역을 찾아내어 해제하는 기능.
(이하 GC)

C 혹은 C++ 에서 할당과 해제를 직접하는 언어들도 있지만

항상 사람은 실수를 하기 마련이기에, 해제를 하지않거나 혹은 해제된 메모리를 사용하면서

문제가 발생하기에 프로그래밍 언어가 직접 메모리 해제를 관리하는 기능이다.

유니티는 C#의 GC와 기본적으로 비슷하지만 몇가지 차이가 있다.

유니티 GC Doc

 

가비지 컬렉터 개요 - Unity 매뉴얼

Unity에서는 가비지 컬렉터를 사용하여 애플리케이션과 Unity에서 더 이상 사용하지 않는 오브젝트로부터 메모리를 회수합니다. 스크립트가 관리되는 힙에 할당하려고 하지만 할당을 수용할 수

docs.unity3d.com

유니티도 버전에 따라 GC의 방법도 개선되었는데

크게 3가지로 나눠볼 수 있다.

  1. 2019 이전 버전
     힙영역 풀스캔이후 메모리 정리
    • 힙영역을 풀스캔하기때문에 GC스파이크가 발생한다
      프로파일러에서 GC가 발생할 때 메모리 사용량이 갑자기 증가하는 것을 볼 수 있다
  2. 2019 이후 버전
    객체의 메모리를 작은 영역과 큰 영역으로 나누고
    작은 영역(85000바이트 미만)은 3세대로 나누며 세대마다 다른 알고리즘을 적용하여 메모리를 정리
    큰 영역은 세대로 구분하지 않고 비교적 덜 수집된다
  3. 유니티의 점진적 GC (Incremental GC)
    메모리 영역을 섹터로 분할하고 메모리를 정리
    • 기존 버전보다 GC스파이크는 개선할 수 있지만 지속적으로 가비지를 수집하여 정리하기 때문에 전체적인 사용량이 증가한다
      전체적인 사용량이 증가한 모습

위처럼 자동으로 GC가 발생하지만 직접 컬렉터를 요청할 수 있다.

System.GC.Collect();

하지만 Doc에서도 알 수 있지만 Collect 함수를 호출한다고 하여 무조건 내가 원하는 GC의 현상이 일어나지 않을 수 있다.

꼭 프로파일러를 확인하고 메모리가 관리되는 모습을 확인해보자

*GC를 직접 호출하는 행위는 메모리를 사용하여 사용되지 않는 메모리를 정리하기 때문에
자주 호출하게되면 오히려 성능에 좋지 않을 수 있다.
꼭 호출해야할 때만 호출하자

'프로그래밍 > Unity3D' 카테고리의 다른 글

Unity - SendMessage  (0) 2023.11.03
Unity - Sprite Atlas 왜 사용할까?  (0) 2023.10.30
Unity IL2CPP 는 무엇인가?  (0) 2023.04.15
Unity UI 최적화 (UGUI Optimization)  (0) 2022.08.24
Rider를 소개합니다  (0) 2022.08.21
profile

내가 일하며 알게 된 프로그래밍

@CtrlVGames