iOS에서 자동 참조 카운팅(ARC)과 가비지 컬렉션(Garbage Collection)의 차이점
Garbage Collection가 뭘까?
1950년대 후반에 개발된 Lisp 프로그래밍 언어에서 처음 도입되었다. 이후에 다양한 언어에 영향을 미쳤으며, Java, C# 등에서 사용된다.
Java GC는 어때?
GC는 힙 메모리를 살펴보고, 사용중인 오브젝트와 사용되지 않는 오브젝트를 식별하고, 사용되지 않는 오브젝트를 삭제하는 프로세스다. 사용 중인 개체 또는 참조된 개체는 프로그램의 일부가 여전히 해당 개체에 대한 포인터를 유지 관리한다는 것을 의미한다. 사용되지 않는 개체 또는 참조되지 않은 개체는 더 이상 프로그램의 어떤 부분에서도 참조하지 않습니다. 따라서 사용하는 메모리를 회수할 수 있다.
Marking
GC는 사용 중인 메모리와 사용되지 않는 메모리를 식별합니다.
참조된 객체와 참조되지 않는 객체를 구분하기 위해 모든 객체를 스캔합니다.
Normal Deletion
일반 삭제는 참조되지 않은 객체를 제거하여 참조된 개체와 포인터를free space에 남깁니다.
Memory allocator는 새 객체를 할당할 수 있는 free space 블록에 대한 참조를 보유합니다.
Deletion with Compacting
성능을 더욱 향상시키려면 참조되지 않은 객체를 삭제할 수 있을 뿐만 아니라 나머지 객체를 압축할 수도 있습니다. 참조된 객체를 함께 압축(이동)하면 새로운 메모리 할당이 훨씬 쉽고 빨라집니다.
ARC는 무엇인가?
자동 참조 카운팅(Automatic Reference Counting, ARC)은 각 객체에 대한 참조 카운트를 유지한다.
참조가 해제될 때 카운트를 감소시키고, reference count가 0이되면 해당 객체의 메모리를 해제한다.
하지만 순환 참조(Circular Reference) 문제가 발생할 수 있다.
weak 및 unowned 참조를 사용하여 순환 참조를 방지할 수 있다.
unowned을 사용하게되면 optional에 대한 확인하지 않기에 오버헤드를 줄일 수 있다.
그래서 뭐가 달라?
메모리 관리 방식에서 GC는 주기적으로 불필요한 오브젝트를 탐지하여 해제하지만, ARC는 실시간으로 메모리를 관리한다.
GC는 가비지 컬렉션 실행 시 일시적인 성능 저하가 발생할 수 있으며, ARC는 참조 카운트를 관리하는 오버헤드가 있다.
GC는 순환 참조를 자동으로 처리하지만, ARC는 순환 참조를 방지하기 위해 추가 작업이 필요하다는 차이점이 있다.