Bitmap OutofMemoryError

|
CreateDrawableFromPath()로 만들면 BitmapDrawable이 생성되어 리턴됩니다.
아래와 같이 Bitamap.recycle()을 호출하면 garbage collection이 일어나기 전에 bitmap 리소스 free가 가능하지 않나 합니다.
Drawable d= CreateDrawableFromPath()
if ( d instanceof BitmapDrawable ) {
  BitmapDrawable bd = (BitmapDrawalbe)d;
  Bitmap bm = bd.getBitmap();
  bd.setBitmap(null);
  bb.recycle();
}


http://www.androidpub.com/1282821


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

안드로이드에서 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. 메모리 릭이 발생하지는 않는지 확인하는것은 기본이겠죠.


'Android 개발 > Android SDK' 카테고리의 다른 글

dalvik debugger  (0) 2012.01.09
Handler와 AlarmManager를 통한 Timer 작업 처리  (0) 2011.05.12
안드로이드 App 위젯을 만들어 보자  (0) 2011.05.02
Screen On / Off 핸들링  (0) 2011.05.02
Application, Activity  (0) 2011.04.28
And