일반적으로 Unity Engine에서는 C#을 사용하기 때문에 메모리를 알아서 관리해주는 GC (가비지컬렉션)을 사용한다. 하지만 일반적인 .Net 환경이 아니라 Mono 환경이기 때문에 실제 MS에서 제공하는 .Net의 GC와는 다른 알고리즘을 채택해서 사용한다. 엔진에서 쓰고 있는 GC 알고리즘은 Boehm GC 이다 (정확히는 Boehm-Demers-Weiser GC)이는 .Net에서 쓰고있는 GC 알고리즘 (Mark and Sweep)은 세대별구분을 하여 메모리 단편화에 대한 정렬까지 지원해주는 방식이지만, Unity Engine에서는 메모리 단편화에 대한 정렬을 해주지 않는 방식을 사용한다는 것이다.

엔진에서 채택하고 있는 Boehm 방식에 대한 설명

Boehm GC

엔진에서 채택하고 있는 방식은 위에 설명한 .Net의 GC와는 다르게 비세대, 비압축(메모리 단편화가 존재하는 의미) 방식으로 동작 한다.

위 그림이 메모리 파편화의 예시이다.

만약에 파편화가 되어있으면 남은 전체의 공간이 충분하더라도 공간이 연속적이지 못해서 메모리 할당을 할 수 없게 된다.

GC 이후에도 공간이 생기지 않으면 엔진은 Managed Heap의 공간을 2배로 늘리게 된다.

이렇게 한번 늘어나면 크기를 잘 줄이지 않는다. 언젠가 다시 더 큰 메모리가 필요할 수 있으니까. 그리고 언제가 될지 모른다.

따라서 엔진을 사용하여 게임을 개발 할 때 최대한 GC가 작동하지 않도록 최적화 하는 것이 중요하다.