본문 바로가기
유니티

[Unity] Garbage Collector

728x90
반응형

🎲 Garbage Collector란?

    C#에서 불필요한 메모리를 자동으로 할당해주는 기능을 Garbage Collection이라고 하고 이 기능을 관리해주는것이 바로 Garbage Collector입니다. Garbage Collector(이하 GC)는 힙 영역에 메모리를 할당받으려고 할 때 여분 메모리가 부족할 경우 작동됩니다.  GC실행 후에도 메모리가 부족할 경우 프로그램이 강제종료됩니다.

 

🍳 메모리 구분

    Stack메모리는 먼저 할당된 메모리가 나중에 할당해제되는 FILO(First In Last Out)으로 Garbage Memory가 생성될 일이 거의 없습니다. 문제는 Heap메모리인데 유니티에서 Heap메모리는 두가지 영역으로 구분됩니다. 첫번째로 Native Heap은 C++로 구성된 유니티 내부에서 사용하는 메모리 영역으로 Texture, Mesh, Asset등이 저장됩니다. 두번째로는 Managed Heap으로 유니티 사용자가 script에서 할당한 메모리가 저장되는 영역입니다. GC는 이 Managed Heap에서만 작동됩니다.

 

🍳 GC 스파이크 란?

    GC는 작동되어야할 타이밍을 임의로 판단하여 실행됩니다. 이때 Stop the word으로 다른 기능들이 일시적으로 중단되는데 이를 GC 스파이크라고 부릅니다. 이러한 임의의 기능 중단은 게임같은 실시간 프로그램에서는 치명적일 수 있습니다.

 

🍳 GC 스파이크를 방지하기 위한 두가지 방법

 

1.주기적인 GC 호출

    당연한 이야기 이지만 사용중인 힙 메모리의 크기가 클수록 GC의 소요시간이 증가합니다. 그렇기 때문에 일정 프레임마다, 혹은 불필요한 메모리가 생성됬다고 판단될 때 마다 GC를 임의로 작동시켜 미리미리 관리해주는 방법도 있습니다. 하지만 이러한 방식은 연산량을 눈에 띄게 증가시킬 수 있기 때문에 여러 상황을 고려해보고 사용하는 것이 좋습니다.

 

2.점진적 가비지 컬렉터

    점진적 가비지 컬렉터는 GC 스파이크의 리스크를 줄이고자 고안된 방법입니다. GC를 한 프레임내에서 전부 끝내지 않고 여러 프레임에 나눠서 마치 코루틴처럼 비동기적으로 수행하는 방식입니다. 이러한 방식은 GC가 끝나는 최종적인 시간은 조금 뒤로 밀릴지라도 GC스파이크나 프레임드랍이 발생하지 않기 때문에 게임같은 실시간 프로그램에서는 유용할 수 있습니다. 

 

반응형