Program/Android

memory leak 회피하기

나이트로 2010. 11. 12. 11:55
안드로이드펍에서 이재영 님의 글을 복사 해 왔습니다.

문제 되면 삭제 하겠습니다.

http://www.androidpub.com/?mid=android_dev_info&page=3&document_srl=818409

안드로이드 어플을 개발할 때 허용되는 힙 사이즈는 디바이스마다 다르긴 하지만 대략 15메가 내외로 제한적입니다.
이 상황에서 카메라 어플이나 포토에딧 어플과 같은
큰 이미지를 제어한다던지, 겔러리나 리스트 뷰에서 다량의 이미지를 제어하는 경우,
거의 대부분 out of memory 문제를 접하게 됩니다.

이런 경우에 대해서 잘 정리된 사이트가 있어서 먼저 소개 합니다.

대부분의 메모리 문제의 경우, Bitmap recycle 과 Drawable callback 을 null 로 맞추어서 해결할 수 있습니다만,
겔러리나 리스트뷰의 경우 ListAdapter 에서 생성하는 View 를 제대로 unbind 를 해주지 않는다면 메모리 문제가 발생할 수 있습니다.

특히 BitmapDrawable 과 NinePatchDrawable 을 명확하게 구분해서 사용해야 하는데,
메모리를 많이 사용하는 어플의 경우 힙 사이즈 제한으로 인해 bitmap 을 개발자가 create / recycle 하면서 메모리를 관리하게 되는데,
NinePatchDrawable 을 사용한 경우 해당 bitmap 을 개발자가 recycle 할 수 있는 방법이 없기 때문에
bitmap create / recycle 이 필요한 경우 BitmapDrawable 을 사용해야 하는 경우가 있습니다.

또한 ListAdapter 의 경우, 항상 view 를 새로 생성하는 방식은 피해야 하며,
일반적으로 convertView 를 사용하지만, 때에 따라서 개발자가 직접 view instance 를 관리하는게
메모리 관리에 있어서는 더 명확해 보일 수도 있습니다.

또한 activity 의 onPause 에서 메모리를 해제할 것들과 onDestroy 에서 메모리를 해제할 것들을 구분해야 하며,
activity 를 start 할 때 flag 를 어떻게 줄 것인지도 같이 고민을 해야
background 에 있는 activity 의 메모리로 인해, 현재 activity 에서 out of memory 가 발생하는 문제도 해결 할 수 있을 것입니다.

감사합니다.