Android GC vs iOS Ref Counting

가끔가다 Fragmented Podcast를 듣는다. 안드로이드 앱 개발자들이 앱 개발 관련 기술적인 주제를 설명해주는 팟캐스트이다. 일하다가 한 번쯤은 접했을 법한 주제에 대해 이해하기 쉽게 설명해주고 개발자로서 본인들의 의견도 덧붙여 준다. 내용도 좋고 방송 진행이 군더더기 없이 깔끔하다.

오늘은 안드로이드(자바)의 Garbage Collection과 iOS의 Reference Counting을 비교하는 내용이 다루어졌는데, 내용이 좋았어서 기억나는 주요 내용을 아래 기록해 두었다 (링크). 잘못 이해한 부분이 있으면 부디 지적해주시길…

  • GC와 RC 모두 사용하지 않는 객체를 메모리에서 해제하기 위한 수단이다. 하지만 동작하는 방식에 차이가 있고, 이는 두 운영체제의 설계 의도를 반영하는 듯 하다. 개발자가 각 운영체제에서 앱을 개발할 때 상이한 종류의 고민을 갖게 만들기도 하다.
  • GC는 Mark-and-sweep 알고리즘 기반으로 동작한다. Garbage Collector가 GC root을 순회하면서 참조할 수 있는 모든 오브젝트를 마킹한다. 이후 불특정한 시간에 마킹되지 않은 모든 오브젝트가 메모리로부터 수거된다. 단점은 (1) 언제 garbage가 수거되는지 예측할 수 없고, (2) 지금보다 단말 성능이 좋지 않던 시절 한번에 많은 수거가 일어나기라도 하면 앱 동작이 버벅거렸다는 점이다.
  • RC는 각 오브젝트에 대한 Automatic Ref Counting을 수행하는 방식으로, 참조되는 수가 0이 되면 해당 오브젝트가 메모리로부터 제거된다. GC가 중앙집중적인 관리라면 RC는 분산적인 관리라고 할 수 있다. 스마트폰 초창기에 iOS가 안드로이드보다 비교적 더 부드러운 앱 사용자 경험을 제공한 까닭이 여기에 있다.
  • 단말 성능이 많이 좋아진 지금은 RC가 아닌 GC를 사용하기 때문에 안드로이드 사용성이 별로다..라고 할수는 없다.
  • RC의 단점은 순환 참조(circular dependency)가 생겼을 때 오브젝트들이 메모리에 그대로 남아 메모리 누수 현상이 발생하는 것이다. 물론 안드로이드에서도 메모리 누수는 발생하지만 순환 참조가 생겨날 가능성에 대해 iOS에서만큼 개발자들이 고민하지 않아도 된다: 왜냐하면, 만약 순환 참조에 포함된 오브젝트들이 모두 GC root으로부터 참조되지 않고 있다면 콜렉터가 이들을 수거해 갈 수 있기 때문에. 복잡한 어플리케이션을 제작할 때 개발자들이 비즈니스 로직에 더 집중할 수 있도록 도와주는 셈이다.
  • 안드로이드는 “general purpose computing”를 위한것이니 만큼, 복잡하고 큰 규모의 어플리케이션 개발도 지원할 수 있도록 다양한 도구를 제공한다고 한다. 그에 비해 iOS는 부드럽고 매끄러운 사용자 경험을 최우선으로 하는데, GC와 RC의 동작방식이 그러한 설계 의도를 반영하는 것 처럼 보인다고 한다.

 

댓글 남기기