본문 바로가기

TOOL/Unity

Unity CG / Boehm-Demer-Weiser / 점진적 GC

Unity GC


Unity에서는 Boehm-Demer-Wiser(줄여서 Boehm방식 GC)를 사용한다.

이는 Stop the world방식의 GC이다.


하지만 기존의 Boehm방식의 GC는 C / C++을 타겟으로 만들어진 라이브러리였다.

그래서 Mono2.8 이상부턴 SGen으로 GC를 변경하였지만

Unity는 Mono2.8 이하버젼이므로 Boehm방식 GC를 사용한다.



점진적 GC


비점진적 GC의경우 GC가 발생하면 Stop the world를 한 후 한번에 모든 GC처리를 수행 한 후 프로그램을 작동시킨다.

하지만 점진적 GC의 경우 GC작업을 여러개의 슬라이스로 분할하여 GC작업을 위해 프로그램 실행을 한번에 오랫동안 중단하지 않고

여러번에 걸쳐 짧게 중단하는 방법이다.

GC의 수행시간이 짧아지는건 아니지만 여러개의 frame에 걸쳐 워크로드를 분산함으로서 원활한 애니메이션의 맥을 끊는

GC Spike 문제를 크게 줄일 수 있다.



GCSpike


GC가 이루어지는동안 프로그램이 임의로 중단됨으로서 일어나는, 프로그램 실행을 끊는 문제점을 뜻함




비점진적 GC의 경우 GC과정을 한번에 몰아서 수행한다.



점진적 GC의 경우 GC수행과정을 여러개로 나누어 수행한다.








점진적 GC의 단점


점진적 GC가 작업을 분할할 때 분할되는 부분이 마킹단계(모든 관리되는 Object를 scan하여 이들 object가 reference하는 다른 object를 찾고 

아직 사용중인 object를 추적)인 경우를 가정하면

이는 object간 reference의 대부분이 분할된 작업간에 변경되지 않는다고 가정한다.

만약 변경된다면 변경된 object를 다음 반복에서 다시 scan해야한다.

이렇게되면 수행할 작업이 계속해서 추가되므로 점진적 collection이 완료되지 않는 상황이 발생할 수 있으며

이 경우 GC는 비점진적인 전체 collection을 수행하게 된다.


또한 점진적 GC를 사용할때 Unity에서는 reference가 변경될 때 마다 이를 GC에 알려 GC가 object를 다시 scan해야하는지 여부를

판단하도록 하는 wirte barrier라고 하는 추가 코드를 생성해야하는데 이는 reference변경시 overhead가 약간 더해진다.





참고

https://blogs.unity3d.com/kr/2018/11/26/feature-preview-incremental-garbage-collection/

'TOOL > Unity' 카테고리의 다른 글

Scriptable Object  (0) 2019.03.11
Coroutine / IEnumerator / IEnumerable  (0) 2019.03.06
Unity Heap Memory 구조  (0) 2019.03.05
Mono / Mono Behaviour  (0) 2019.03.05
IL2CPP / GCC / C# C++ Assembly 변환과정  (0) 2019.03.05