Skip to content

Latest commit

 

History

History
66 lines (54 loc) · 4.51 KB

ARC_vs_GC.md

File metadata and controls

66 lines (54 loc) · 4.51 KB

ARC & GC

ARC 란?

  • ARC = Automatic Refernce Counting 이라는 메모리 관리 기법을 말한다.
  • Swift는 ARC를 사용하여 메모리를 관리한다.
  • 개발자가 기존에 수동으로 관리하던 reference counting을 자동으로 관리해주는 기술을 말한다.
  • ARC는 런타임이 아닌, 컴파일 시점에 컴파일러가 개발자를 대신하여 메모리 관리 코드를 적절한 위치에 자동으로 삽입한다.

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

GC란?

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

공통의 목적

  • 개발자의 일거리를 덜어주는 목적
  • GC, ARC를 통해 더 이상 참조 카운트를 추적하지 않아도 된다.
  • 객체를 수동으로 메모리에서 해제하는 것에 대해 걱정할 필요가 없어진 것.

비교

비교 ARC GC
시점 컴파일 타임 런타임
원리 컴파일 시점에 언제 참조/해제 되는지 결정 주기적으로 참조를 추적하여 사용하지 않는 인스턴스를 해제
오버헤드 런타임 시점에 추가적인 오버헤드가 발생하지 않는다 런타임 시점에 객체를 추적하는 과정에서 오버헤드가 발생하여 성능저하가 생길 수 있다
단점 순환 참조가 발생 시 메모리 누수의 위험이 있다
기타 - 별도로 동적 객체를 관리할 필요가 없다
기타 - 인스턴스가 해제될 확률이 ARC에 비해 높다

장단점

ARC
장점 - 객체가 사용되지 않을 때, 실시간으로 메모리에서 release 한다.
- 컴파일러가 메모리 반환 코드를 넣어주는 것이기에 오버헤드에서 자유롭다.
- 백그라운드 처리가 없으므로, 모바일과 같은 저전력 시스템에서 더 효과적이다.
(즉, 메모리와 CPU가 데스크탑에 비해 제한적인 모바일 기기에서는 더 중요한 문제이고 그만큼 성능 측면에서 좋다.)
단점 - 다만 개발자의 실수에 의해 순환 참조가 발생될 수 있기에 이를 예방하는 작업이 필요하다.
GC
장점 - Retain Cycle이 발생하지 않는다.
단점 - 항상 메모리를 차지하고 감시해야하기 때문에 메모리 사용량이 늘어날 수 밖에 없고, 지속적인 감시를 위해 CPU를 항상 사용한다.
- 정기적으로 GC가 동작하여 더 이상 사용되지 않는 메모리를 반환하는 방식이므로, 정확한 시간에 releaser가 호출되지 않는다.

ARC는 Retain Cycle을 해결 못하는 이유?

* 순환 참조란?
- 순환 참조는 두개(또는 그 이상)의 객체가 서로를 참조할 때 발생한다.
- 객체에 대한 외부 참조가 해제되어도 서로를 참조하고 있어 alive상태를 유지하는 현상을 말한다.
  • GC는 reachable 객체를 살펴보며 작동한다. 외부 참조가 존재하지 않는 것을 감지하면, 서로를 참조하는 객체 그래프 전체를 버리기에 순환 참조 문제가 발생하지 않는다.
  • ARC는 더 낮은 수준에서 작동하고, 참조 수를 기반으로 생명주기를 관리하기 때문에 Retain Cycle을 자동으로 처리할 수 없으며, 그로 인해 메모리 누수 문제를 일으킨다.
  • ARC는 Retain Cycle을 피하는 방법을 제공하지만, 개발자의 명시적인 설계가 필요하다. -> 이를 위해 strong, weak, unowned 와 같은 Storage Modifier 가 도입되었다.

요약

GC(Garbage Collection)

  • 정기적으로 GC가 동작하여 더 이상 사용되지 않는 메모리를 반환하는 방식, 정확한 시간에 release가 호출되지 않음
  • GC는 runtime에 background에서 메모리를 검사한다.
  • background에서 동작하므로, 앱 성능 저하를 유발한다.

ARC(Automatic Reference Counting)

  • RC(Reference Counting)를 통해 메모리를 관리하는 방식
  • compile time에 retain/release 코드를 주입
  • background에서 동작하지 않음, 저전력 시스템에서 효과적