가비지 컬렉터란?
메모리 관리 기법 중의 하나로, 동적으로 할당한 메모리 영역 중 더 이상 쓰이지 않는 영역을 찾아내어 해제하는 기능.
(이하 GC)
C 혹은 C++ 에서 할당과 해제를 직접하는 언어들도 있지만
항상 사람은 실수를 하기 마련이기에, 해제를 하지않거나 혹은 해제된 메모리를 사용하면서
문제가 발생하기에 프로그래밍 언어가 직접 메모리 해제를 관리하는 기능이다.
유니티는 C#의 GC와 기본적으로 비슷하지만 몇가지 차이가 있다.
가비지 컬렉터 개요 - Unity 매뉴얼
Unity에서는 가비지 컬렉터를 사용하여 애플리케이션과 Unity에서 더 이상 사용하지 않는 오브젝트로부터 메모리를 회수합니다. 스크립트가 관리되는 힙에 할당하려고 하지만 할당을 수용할 수
docs.unity3d.com
유니티도 버전에 따라 GC의 방법도 개선되었는데
크게 3가지로 나눠볼 수 있다.
- 2019 이전 버전
힙영역 풀스캔이후 메모리 정리
- 힙영역을 풀스캔하기때문에 GC스파이크가 발생한다
프로파일러에서 GC가 발생할 때 메모리 사용량이 갑자기 증가하는 것을 볼 수 있다
- 힙영역을 풀스캔하기때문에 GC스파이크가 발생한다
- 2019 이후 버전
객체의 메모리를 작은 영역과 큰 영역으로 나누고
작은 영역(85000바이트 미만)은 3세대로 나누며 세대마다 다른 알고리즘을 적용하여 메모리를 정리
큰 영역은 세대로 구분하지 않고 비교적 덜 수집된다
- 유니티의 점진적 GC (Incremental GC)
메모리 영역을 섹터로 분할하고 메모리를 정리- 기존 버전보다 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 |