[iOS] Garbage Collection vs. Automatic Reference Counting

Eugenie·2022년 7월 19일
0

Garbage Collection, GC

메모리 관리 기법 중 하나로
프로그램이 동적으로 할당했던 메모리 영역중에서
필요없게 된 영역을 해제하는 기능이다.

즉, 동적 할당 된 메모리 영역 가운데
어떤 변수도 가리키지 않는 메모리 영역을 탐지하여
자동으로 해제하는 것이다.

Pros and Cons of GC

프로그래머가 동적으로 할당한 메모리 영역 전체를
완벽하게 관리하지 않아도 된다는 장점이 있다.

다음과 같은 버그를 줄이거나 막을 수 있다.

🎾 유효하지 않은 포인터의 접근

❓ 유효하지 않은 포인터

메모리가 delete 되거나 할당이 해제되어 아무것도 가리키고 있지 않은 포인터
(= Dangling Pointer)

🎾 이중 해제

이미 해제된 메모리를 또 해제하는 것

🎾 메모리 누수

더 이상 사용하지 않는 메모리 영역을 해제하지 않고 남겨두면 메모리 누수가 발생한다.
이러한 메모리 누수가 지속되면 메모리 고갈로 인해 프로그램이 중단될 수 있다.

위와 같이 가비지 컬렉션을 사용하였을 때의 장점도 있지만 단점도 있다.
단점은 다음과 같다.

어떤 메모리를 해제해야 할 지 결정하는 데에
사용되는 알고리즘에 의해 비용이 많이 든다.

객체자 필요없어지는 시점을 프로그래머가 알고 있는 경우에도
가비지 컬렉션 알고리즘이 메모리 해제 시점을 추적해야하기에 비용이 많이 든다.

가비지 컬렉션이 행동하는 타이밍이나 점유 시간을 사전에 예측하기 어렵기 때문에
실시간 시스템에는 적합하지 않다.
할당된 메모리가 해제되는 시점을 알 수 없게 된다.

Automatic Reference Counting, ARC

Swift 에서는
자동 참조 카운트라는 메모리 관리 기법을 사용한다.

ARC 는 런타임에 메모리 관리 작업이 진행되는 것이 아니라
컴파일 시점에 컴파일러가 개발자를 대신하여
메모리 관리 코드를 적절한 위치에 자동으로 삽입한다.

즉, Swift 코드에서 개발자가 release 코드를 직접 작성하지 않아도
실제로 바이너리 코드에는 메모리 해제 코드가 들어가도록 한다는 것이다.

GC vs. ARC

다음은 각각의 특징을 정리한 것이다.

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

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

런타임에 수행되는 가비지 컬렉션은 항상 메모리를 차지하고 감시해야하기 때문에
메모리 사용량이 더 늘어날 수밖에 없으며, 지속적인 감시를 위해 CPU 일부를 사용해야만 한다.

ARC 는 컴파일러가 메모리 반환 코드를 넣어주는 것이기 때문에
오버헤드에서 자유롭다는 특징이 있다.
특히, 메모리와 CPU 가 데스크탑에 비해 제한적인 모바일 기기에서는 더 중요한 문제이고
그만큼 성능 측면에서 이득이라고 할 수 있다.
다만 개발자의 실수에 의해 순환참조가 발생할 수 있기 때문에 이를 예방할 작업이 필요하다.


📚 Reference
가비지 컬렉션(Garbage Collection)이란?
[Dangling Pointer] 유효하지 않은 포인터
Swift - ARC vs GC

profile
🌱 iOS developer

0개의 댓글