본문 바로가기

Android

Android VS iOS 메모리 관리 방법

원문은 여기에서 확인할 수 있습니다.


Android 와 iOS의 메모리 관리 기법은 어떻게 다른지 알아보도록 하겠습니다.



Android는 CMS (Concurrent Mark-Sweep) 

Step


1. GC Root 를 정의합니다. 


2. Mark 단계를 시작합니다. 


  생성된 모든 객체에는 기본적으로 0인 mark bit 가 설정되어집니다. 

  객체를 방문하면 1 로 설정합니다.

아래 그림에서 mark bit 가 0은 회색으로 칠해져 있습니다.


3. Sweeping


  가비지 컬렉터는 mark bit가 0으로 설정된 모든 객체를 찾기 위해 메모리 힙을 검색합니다. 

  mark bit 가 0인 객체들을 제거하고 다시 모든 객체의 mark bit를 0으로 재 설정합니다.



iOS ARC (Automatic Reference Counting)


변수, 상수에 객체를 할당할 때마다 참조카운트를 증가시킵니다.

아래 그림에서 "ref counts = 2" 해당되는 내용입니다.


참조 카운트가 0으로 가자마자 즉시! 수거됩니다.


아래 그림에 해결방안은 무엇일까요? 

weak, unowned 키워드를 자주 보신 적이 있으실 겁니다. 


두 키워드는 참조 카운트를 증가시키지 않기 때문에 memory leak 을 발생시키지 않습니다. 






장단점

Android 가비지 컬렉터가 실행될때 모든 스레드가 중지되며 이는 곧 성능이 저하됨을 의미합니다. 

하지만 개발하면서 메모리를 따로 관리 하지 않아도 된다는 장점이 있습니다. 


iOS 는 개별 객체에 대해서 메모리를 관리해주어야 하는 단점이 있지만 ref counts 가 0이 되면 즉시! 수거되는 장점이 있습니다.

결론

개인적인 경험상으로 개발하면서 메모리 누수가 가장 많이 발생할 수 있는 상황은 Callback 입니다. 

Callback을 적절히 해제하지 않고 View가 종료된다면 해제되지 않은 Callback은 View를 참조하고 있기 때문에 메모리 누수가 발생하는 상황을 많이 접하게 됩니다.


View의 Lifecycle 에 따라 적절하게 할당과 해제를 해주면 메모리 릭을 방지 할 수 있습니다. 





'Android' 카테고리의 다른 글

Android Test Case 개발 방법  (0) 2019.03.19