본문 바로가기

ETC/Algorithm

Mark and Sweep / Copying GC

Mark and Sweep


Mark and Sweep은 GC Algorithm에서도 시초가 되는 algorithm이며 가장 간단한 GC방법이다.

이름만 살펴보면 mark, sweep로 알 수 있는데 조금 더 풀어보면 memory가 부족하거나 사용하지 않는 memory를 없애야 할 떄 

사용하는 memory를 mark하고 표시가 해제된 memory 영역을 sweep하여 청소하는 방식이다.





Application memory에서 새롭게 object가 생성되었을 때의 상태 표시이다.

상자들에 붙어 있는 초록색 번개는 사용중인 object를 mark한 것이다.

보통은 1개의 Object당 1bit를 사용한다.



오랜시간동안 GC가 sweep을 하지 않아 사용되지 않는 object를 청소하려 했으나 아무것도 없어 그냥 넘어가고

Object2가 더이상 참조되지않아 object2를 사용되지 않는다고 mark하였다.



GC가 memory들을 정할 때가 되어 unreachable(사용되지 않는 메모리들)을 sweep하여 정리한다.



mark-and-sweep의 문제점


Sweep단계에서 모든 개체들을 추적하여 check해야 한다.(모든 개체를 추적하는데 시간과 비용이 소모된다.)

Memory Fragmentation(메모리 단편화, 파편화)에 대한 대책이 없다.

(해당 메모리 단편화에 대한 문제점을 보완한 알고리즘이 mark-and-compact algorithm이 있다.)





Sgen의 경우 메모리 단편화를 해결하기 위해 Copying(객체 이동 기법) GC로 해결했다.



Copying GC


mark-and-sweep에서의 memory fragmentation을 메커니점을 바꾸어 해결하는 방법


해당 그림에서는 3단계를 나누어 Copying GC를 설명하고 있다.

Collection전에 이미 흰색으로 mark된 닿을 수 없는(unreachable), 버려진 memory와 현재 사용중인 memory가 한 공간에 존재한다.

또한 첫번째 그림에는 없지만 현재 실제로 사용하는 memory가 있는 공간 외에도 같은 size를 가진 공간이 하나 더 존재한다.

두번째 그림을 보면 이해가 갈것이다.

GC를 하게 되면 사용하던 memory들이 존재하던 공간말고 다른 공간에 사용하던 memory들만 복사한다.

이때 unreachable memory들은 복사하지 않는다.

복사과정이 끝나면 기존에 있던 memory 정보들은 전부 지운다.

그다음 GC과정에서 지워버린 공간으로 복사 후 쓰던공간을 지우는것을 반복한다.

이렇게 Copying하고 지우고 하는 과정이 무한 반복되는 방법이 Copying GC algorithm이다.








참고

https://hrmrzizon.github.io/2017/04/23/garbage-collector-in-unity/