[기술] .Net과 Unity의 GC

oy Hong·2024년 4월 11일

기술

목록 보기
8/23

.Net과 Unity의 GC


Mark and Sweep 알고리즘을 기반으로 동작하는 것은 같으나 Unity는 세대구분이 없고 메모리 정렬도 없다.

Unity 19버전 이상에서는 점진적 GC를 도입하였다.

  • 가비지 컬렉션 프로세스를 여러 프레임에 분산시켜 실행

상호 참조 해결법

C#에서 상호 참조 중인 객체 해제에 대해서는 Mark and Sweep 알고리즘을 설명하면 된다.

만일 두 객체가 서로 참조 중이라 하더라도 외부에서 참조가 없어 Mark 되지 않는다면 Sweep 단계에서 해제되게 된다.

Mark and Sweep 간단 설명
Root 부터 사용하는 객체들을 타고 가면서 사용하는 객체들을 mark 하고 이후 mark 되지 않은 객체들을 전부 제거하게 된다.

  • root는 현재 사용하는 함수의 지역변수나 현 시점 클래스의 static 변수 등이 될 수 있다.

상호 참조가 제거 되는 과정

객체 1, 2가 서로를 참조하고 있을 때 객체 1이 더 이상 사용되지 않는 상황이 되었다고 가정해 볼 때,

  1. 이 경우 GC가 한번 동작하면 객체 2가 객체 1을 참조하고 있으므로 객체 1이 살아있을 수 있게 된다.
  2. 물론 객체 2는 직접 사용하고 있으니 당연히 사라지지 않게 된다.
  3. 이후 객체 2도 사용 하지 않게 되면 mark 단계에서 객체 1, 2는 더이상 mark되지 않고 이후 sweep 과정에서 둘 다 사라지게 된다.

이런 식으로 상호 참조 중인 객체들이 해제되지 않는 문제를 피할 수 있다.

0개의 댓글