2013년 2월 5일 화요일

Android 메모리 관리 문제

모바일 어플리케이션이 개발됨에 따라 고화질의 이미지 및 다양한 시스템 자원을 포함하는 등 점점 중량화 되어 가고 있다. 모바일 단말의 경우, 성능 및 메모리 등에 큰 제약이 있기 때문에 이를 고려한 개발이 필요시 된다. 특히 안드로이드의 시스템은 비트맵 관련 이미지 및 자원들의 메모리 할당에 큰 제약이 있는데 원인은 안드로이드 메모리 구조에 바탕을 두고 있다. 안드로이드 메모리 영역은 크게 두 가지 영역으로 나눌 수 있다.

1. Allocation Heap(VM Heap, Java에서 사용)
2. Native Heap(C에서 사용)

비트맵 객체들은 다른 자원들과 달리 ‘Native Hep’에 할당되어 관리된다. 아무리 VM Heap 메모리 사이즈가 크다 하더라도 Native Heap 메모리 사이즈가 부족할 경우, 다량의 비트맵 이미지를 사용할 수 없게 된다.
또한 자바의 경우, 가비지 컬렉션(GC)을 통해 더 이상 참조되고 있지 않은 객체를 자동으로 메모리에서 해제하는 방식인데 Native Heap에 할당된 비트맵 객체의 경우, 이러한 GC을 통해 자동으로 관리 및 해제가 되지 못하여 메모리 소진 문제가 발생하기도 한다.

메모리 관리 기법
Heap Size 옵션
안드로이드 3.0 부터 더 큰 힙 메모리 사이즈를 사용하기 위한 방법으로 ‘largeHeap’ 옵션이 생겼으나 이와 같은 옵션을 사용하는 경우, 그 만큼 GC 시간을 더 소모하게 된다는 것을 유념해야 한다.

메모리 누수 방지
메모리 누수의 경우,
1. 사용자 인터페이스를 구성하는 기본 단위인 Activity의 생명주기와 비트맵 객체의 생명주기 차이에 기인하여 발생한다.
2. 액티비티 외부에서  static 변수가 해당 액티비티를 참조하고 있는 상황이 생길 수 있는데, 참조하고 있는 변수가 살아 있는 동안 액티비티 해제가 이루어질 수 없으므로 메모리 누수가 발생하게 된다
3. 단말기 화면의 방향 전환으로 인한 메모리 누수 문제가 발생할 수 있는데, 안드로이드의 경우 단말기 화면의 방향 전환 과정이 반복될 경우, 매번 화면 구성을 위한 액티비티가 생성 및 소멸 된다. 이 과정에서 비트맵 객체등 멤버 객체들이 적시에 소멸도지 못하여 메모리 누수가 발생할 수 있다.

이를 해결하기 위해서는 액티비티를 해제할 때 액티비티 내부의 모든 뷰들의 참조를 끊어주고 명시적으로 비트맵 객체를 해제해주어야 한다. 'recursiveRecycle'라는 함수를 구현함으로서 액티비티 내부의 모든 뷰의 참조를 끊어줄 수 있다. 또한 context가 자신의 범위 외에서 사용되지 않도록 해야 하는데, 액티비티의 'context' 대신 어플래케이션과 동일한 라이프사이클을 가지는 'application contex't를 사용하는 방법이 있다.
화면 방향 전환 위해서 'configChanges=”orientation”'을 설정하면 액티비티가 매번 생성 소멸하지 않게 하거나 비트맵 관련 객체들을 static으로 구성하는 방법 등이 있다.

댓글 없음:

댓글 쓰기

Which Mobile App Development Option is Better?

Different alternatives to native code development have their own advantages and philosophy behind. No one tool or approach can be clearly ma...