swift를 공부하면서 ARC라는 것을 배우게 되었다.
옛날에 JAVA를 공부할 때 GC와 비슷한 개념인 것 같아서 두 개를 비교해서 정리해보려고 한다.
JAVA
로 개발하면 GC
가 알아서 메모리 관리를 해주기 때문에 순환 참조 같은 문제는 고려할 필요가 없다. 그러나, iOS를 하다보면 순환 참조 문제를 반드시 겪게 된다. 그렇다면 GC
랑 ARC
가 뭐가 다르길래 순환 참조 문제를 해결할 수 없는 걸까?객체의 라이프 사이클 관리가 나오기 이전에는 개발자가 직접 모든 객체의 생명주기를 직접 신경써야 했다. 객체가 필요할 때 생성하고, 다 이용하면 명시적으로 메모리에서 해제(release)해 주어야 했던 것이다. 이것은 코드가 복잡해 질 뿐만 아니라 객체 구조를 유지하기 힘들게 만든다.
GC
나 ARC
는 모두 개발자의 짐을 덜어주는 데에 목적이 있다. GC
나 ARC
의 탄생으로 더 이상 참조 카운트를 추적하지 않아도 되었다. 또한, 소유권을 신경쓰지 않아도 되었다. 결과적으로 사용되지 않는 객체를 수동으로 메모리에서 해제 하는 것에 대해 걱정할 필요가 없어진 것이다.-GC
란 이미 할당된 메모리에서 더 이상 사용하지 않는 메모리를 해제하는 기술을 말한다. Java
에서 사용되고 있는 객체 생명주기 관리 기술이다.
GC
는 runtime에 동작하는데, 백그라운드에서 사용되지 않는 객체 및 객체 그래프를 관리한다. GC는 불확실한 간격으로 발생하므로(특정시간이 경과한 후, 혹은 런타임에 사용가능한 메모리가 줄어드는 경우), 객체가 더이상 사용되지 않는 정확한 순간에 반드시 해제 되는 것은 아니다.
GC
가 발생하는 경우, application의 다른 스레드가 일시적으로 멈 출 수 있다.ARC
란 개발자가 기존에 수동으로 개발자가 직접 retain/release
를 통해 reference counting
을 관리해야하는 부분을 자동으로 관리해는 기술을 말한다.
ARC
는 GC
와 다른 접근 방식을 취한다. 런타임에 백그라운드에서 사용하지 않는 객체를 찾아 처리하는 대신, 컴파일러가 객체의 참조 회수를 추적하고, 필요에 따라 자동으로 객체를 release하는 코드를 실행 파일에 주입한다.
alive
상태를 유지하는 현상을 말한다.GC
는 reachable
객체를 살펴 보며 작동한다. 외부 참조가 존재하지 않는 것을 감지하면, 서로를 참조하는 객체 그래프 전체를 버린다. 때문에, 순환 참조문제가 발생하지 않는다.
ARC
는 더 낮은 수준에서 작동하고, 참조 수를 기반으로 생명 주기를 관리하기 때문에 retain cycle을 자동으로 처리할 수 없으며, 결과적으로 메모리 누수 문제를 일으킨다.
ARC
는 retain cycle을 피하는 방법을 제공 하지만, 개발자의 명시적인 설계가 필요하다. 이를 위해 ARC는 strong
, week
, unowned
와 같은 Storage Modifier를 도입한 것이다.