posted by By훈트 2011.03.08 14:34
메모리 부족 관련 질문들이 있어서 정리 합니다. (기억을 더듬어 작성하는거라 잘못된 부분이 있으면 댓글로 말씀주세요)

안드로이드에서 OutOfMemoryError라 발생하는 가장 많은 경우는 바로 비트맵 로딩때문에 발생합니다. 
그 경우 Logcat에서 다음과 같은 메시지를 보실 수 있습니다.

"java.lang.OutOfMemoryError: bitmap size exceeds VM budget"

안드로이드는 애플리케이션 프로세스별로 메모리가 제한되어있다는 것은 다 아실텐데 (16M, 24M, 32M등)  
문제는 위의 메모리 에러가 DDMS에서 가장 쉽게 확인할 수 있는 메모리 값인 VM Heap 사이즈와는 크게 상관없이 발생합니다.
Bitmap을 로딩할 경우 VM 내의 힙메모리를 사용하는게 아니라 VM밖의 Native 힙메모리 영역을 사용하기때문입니다.

0. 가용 메모리의 확인 

아래의 API들을 활용해서 Native Heap 값을 확인할수 있습니다.
Debug.getNativeHeapSize(), Debug.getNativeHeapFreeSize(), Debug.getNativeHeapAllocatedSize()
위 사이즈들은 단말별, 버전별로 조금씩 달라질수 있으니 레퍼런스 폰을 기준으로 약간 여유를 두는 것이 좋을겁니다.

해결 방법은 이미 많은 분들이 작성한 글들이 있는데 정리해보면

1. 아주 큰 이미지 파일을 불러오는 경우 BitmapFactory.Options.inSampleSize 설정을 통해 축소해서 메모리에 로드해야합니다.


2. 이미지의 경우 시스템이 알아서 판단해서 적합한 형식으로 로딩하는데 디폴트인 RGB8888(픽셀당 4바이트)로 로딩하는 경우가 
   많습니다. 이미지를 많이 사용하는 게임등의 경우 투명 이미지는 RGB4444, 불투명 이미지는 RGB565로 충분한 경우가 많으니 
   BitmapFactory.Options.inPreferredConfig 설정값을 어떻게 주고 있는지 확인해보시기 바랍니다. 

3. 더이상 쓰지않는 Bitmap의 경우 Recycle 을 호출해서 바로 가용 메모리를 늘려줍니다.

   bitmap.recycle(); bitmap = null;

  ((BitmapDrawable)imageView.getDrawable()).getBitmap().recycle();


4. 메모리 릭이 발생하지는 않는지 확인하는것은 기본이겠죠.




메모리 관련해서는 저도 확실하게 모르는 부분이 있으니 댓글로 추가 정보 주시면 감사하겠습니다.


저작자 표시
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

티스토리 툴바