본문 바로가기
면접 스터디

면접스터디 : GC(Garbage Collection)와 ARC

by iOS 개린이 2023. 1. 10.

Swift에서 ARC로 메모리를 관리하듯이, 다른 언어들도 메모리를 관리해주는 관리 모델이 있는데 대표적인 것이 GC(Garbage Collection)이다.

 

ARC

-메모리 영역 중 heap 영역은 동적인 관리가 필요하다. 

따라서 필요가 없는 메모리는 적절한 때에 소멸시켜주어야 하는데 이 메모리 관리를 ARC(Auto Reference Counting) 도구를 이용해서 한다.

 

-ARC는 heap 영역에 참조형 자료들이 얼마나 참조되고 있는지 참조횟수로 Count 하고,

참조횟수가 0이 될 때, 메모리가 해제되는 형식이다.

 

-참조횟수가 0이 된다는 것 = 클래스의 인스턴스가 더 이상 필요하지 않을 때 

 

-컴파일 단계에서 코드 분석을 통해 언제 참조되고(retain), 언제 해제 되는지(release)에 대한 함수 등을 적절한 위치에 넣어주고, 런타임 단계에 함수가 실행된다. 여기서 중요한 것은 ARC는 컴파일 단계에서 실행 된다는 것

 

1. retain: 객체가 메모리에서 해제되지 않도록 참조횟수를 증가시켜주는 함수

2. release: 객체가 참조 해제될 때 참조횟수를 감소시켜주는 함수

 

 

GC

-필요하지 않은 메모리를 Garbage라고 한다. 

이 Garbage들이 메모리 상에 존재한다는 것이 메모리 누수이기 때문에 효율적으로 관리해주기 위해 GC가 주기적으로 검사해서 메모리를 해제시켜준다.

 

-GC는 프로그램 실행 중에 동적으로 감시하고 있다가 Garbage를 찾으면 삭제시켜준다. 

여기서 중요한 것은 런타임 단계에서 실행 된다는 것

런타임 중 주기적으로 참조를 추적해서 참조가 없어진 인스턴스를 소멸시켜준다.

 

 

 

ARC와 GC의 차이점

 

-ARC는 컴파일 단계에서, GC는 런타임 단계에서 실행된다.

 

GC는 런타임 시점에 계속 메모리를 감시하고, 해제 시켜주는 작업을 한다.

이것은 GC도 메모리 상에 같이 올라와 있는 하나의 도구이기 때문에 그만큼 메모리를 차지하고 있는 것이다.

 

이에 반해 ARC는 컴파일 단계에서 작업을 심어놓고, 런타임에 실행만 하면 끝이기 때문에 메모리를 차지하지 않는다.

GC는 메모리를 차지하고, 작업을 위해 CPU도 사용하기 때문에 ARC에 비해 성능의 오버헤드를 발생시키는 것이다.

 

둘의 차이점은 Apple이 ARC를 선택한 이유이기도 하다. 

모바일 디바이스는 상대적으로 제한적인 메모리와 CPU를 가지고 있기에 민감하다. 

그렇기에 GC에 비해 메모리와 CPU가 효율적인 ARC를 사용하는 것이다.

 

 

그럼 무조건 성능 좋은 ARC를 써야 하는 것 아닌가요?

 

-대답은 "NO" 둘 다 장단점을 가지고 있다. 

GC는 ARC에 비해 성능면에서는 떨어지지만 작업의 안전성?은 ARC보다 뛰어나다.

 

GC는 런타임 시점에 계속 감시를 하기 때문에 계속 참조를 추적하고, 해제할 수 있는데 

반면, ARC는 컴파일 단계에서 작업을 모두 결정하고, 런타임에 실행되기 때문에 순환참조 같은 문제가 발생하면 그대로 메모리 누수가 발생된다.

 

ARC는 성능면에서 효율적이고, 참조 해제 시점을 알 수 있다는 장점이 있지만, 안전성이 상대적으로 부족.

GC는 성능면에서 상대적으로 오버헤드를 발생시키지만, 작업의 안전성은 상대적으로 높음.