원문은 여기에서 확인할 수 있습니다.
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 |
---|