C# - 가비지 컬렉터

김효중·2025년 4월 24일

개요

유니티를 막론하고 C#의 특징으로는 GC(가비지 컬렉터)가 있다.
가비지 컬렉터는 더 이상 사용하지 않는 메모리를 자동적으로 정리해주는 시스템이다.
new등을 통해 생성한 객체가 참조되지 않으면 가비지 컬렉터가 자동으로 메모리를 회수한다.

이는 메모리 누수를 막아주지만 GC가 작동할 때는 잠깐의 렉이 발생할 수 있다.

Mark-and-Sweep

C#은 Mark-and-Sweep 알고리즘을 사용하여 가비지 컬렉터가 작동된다.
Mark-and-Sweep 알고리즘은 쓸모 있는 메모리는 남기고 나머지를 치우는 방식이다.

전역 변수와 현재 함수의 로컬 변수등을 루트 오브젝트로 잡고
이 루트 오브젝트를 기반으로 이를 참조하고 있는 객체들 타고 다니며 마킹한다.
이러한 마킹이 끝나면 마킹 되지 않은 객체를 가비지로 판단하여 제거한다.

.Net과 유니티의 가비지 컬렉터

이 둘은 내부적으로 둘 다 Mark-and-Sweep을 사용하지만 세부 과정이 다르다.

.Net

.Net에서는 0~2세대의 가비지 컬렉터을 통해서 관리를한다.
또한 멀티스레드와 병렬처리가 가능하다.
일반적인 앱에서는 렉이 걸리지 않는다.

유니티

유니티는 Mono의 가비지 컬렉터를 사용하기에 세대의 개념이 없다.
유니티는 메인 스레드에서 실행되기에 단일 스레드로 진행된다.
특히 게임에는 전체 힙을 스캔하는 가비지 컬렉터는 프레임 드랍을 유발 할 수 있어 최적화가 필요하다.

그렇기에 오브젝트 풀링이나 구조체를 이용한 최적화가 필수이다

profile
도전하는 개발자

0개의 댓글