Swift - ARC vs GC

Swift의 ARC

Swift에서는 Automatic Reference Counting 이라는 메모리 관리 기법을 사용한다. Swift와 마찬가지로 다른 언어들 역시 각자의 메모리 관리 기법이 있는데 가장 대표적인 것이 GC(garbage collection)이다. Swift의 ARC와 GC를 비교해보자.

ARC

ARC는 런타임에 작업이 메모리 관리 작업이 진행되는 것이 아니라 컴파일 시점에 컴파일러가 개발자를 대신하여 메모리 관리 코드를 적절한 위치에 자동으로 삽입한다. 즉, Swift 코드에서 개발자가 release 코드를 직접 작성하지 않아도 실제로 바이너리 코드에는 메모리 해제 코드가 들어가도록 한다는 것이다.

GC(Garbage Collection)

GC 방식은 메모리 관리를 Garbage Collector라는 것이 프로그램 실행중에 동적으로 감시하고 있다가, 더 이상 사용할 필요가 없다고 여겨지는 것(garbage)을 메모리에서 삭제하는 것이다. 여기서 가장 중요한 포인트는 런타임에 메모리 관리를 한다는 것이다. garbage는 어떤 변수도 가리키지 않게된 메모리 영역을 의미한다.

GC vs ARC

GC

  • 런타임의 작업이며 주기적으로 참조를 추적하여 사용하지 않는 인스턴스를 해제한다.
  • 개발자가 별도로 동적 객체를 관리할 필요가 없다.
  • 인스턴스가 해제될 확률이 ARC에 비해 높다.
  • 런타임 시점에 객체를 추적하는 과정에서 오버헤드가 발생하며, 이로인한 성능저하가 있을 수 있다.

ARC

  • 컴파일 타임의 작업이며, 컴파일 시점에 언제 참조되고 해제되는지 결정된다.
  • 런타임 시점에 추가적인 오버헤드가 발생하지 않는다.
  • 순환참조(retain cycle) 발생 시 메모리 누수의 위험이 있다.

런타임에 수행되는 가비지 컬렉션은 항상 메모리를 차지하고 감시해야하기 때문에 메모리 사용량이 더 늘어날 수 밖에 없으며 지속적인 감시를 위해 CPU를 일부 사용해야만한다. 반면에 ARC는 컴파일러가 메모리 반환 코드를 넣어주는 것이기에 그런 오버헤드에서 자유롭다는 특징이 있다. 이는 특히 메모리와 CPU가 데스크탑에 비해 제한적인 모바일 기기에서는 더 중요한 문제이고 그만큼 성능 측면에서 이득이다. 다만 개발자의 실수에 의하여 순환참조가 발생될 수 있기 때문에 이를 예방할 작업이 필요하다.

Reference

유셩장님의 블로그

https://linux-studying.tistory.com/18

Tags:

Categories:

Updated: