Out of memory error가 나면서 죽습니다.
아래 로그는 홈화면에서 도움말 버튼을 누르면 도움말 activity를 실행하게 되는데 그 과정에서 찍힌 것입니다.
도움말 activity에서는 배경 이미지, 버튼 이미지 등을 아래와 같은 코드로 불러옵니다. 이 과정에서 죽습니다.
bgImg.setBackgroundResource(R.drawable.a_num_4_help_bg);
bgTitleImg.setBackgroundResource(R.drawable.a_num_4_help_bg_title);
homeBtn.setBackgroundResource(R.drawable.home_button);
메모리 사용량, free 메모리를 찍어보았는데.. 여유가 있는데도 죽는 것 같습니다. (제가 잘못 이해하고 있는 부분이 있는 건지 모르겠지만.. 이미지들의 총합이 1MB를 넘지 않습니다. 아래 로그에서 resume 시 heap의 경우 3MB 정도, 여유가 있는 것으로 보이는데 말이지요.)
로그의 메모리 사용량은 아래 코드를 이용해서 찍은 것입니다.
android.util.Log.d("TAG","Native heap size: "+(Debug.getNativeHeapSize() / (1024)) + "KB");
android.util.Log.d("TAG","Heap Free size : "+(Debug.getNativeHeapFreeSize() / (1024)) + "KB");
android.util.Log.d("TAG","Heap Allocated size : "+(Debug.getNativeHeapAllocatedSize() / (1024)) + "KB");
android.util.Log.d("TAG","TOTAL MEMORY : "+(Runtime.getRuntime().totalMemory() / (1024 * 1024)) + "MB");
android.util.Log.d("TAG","MAX MEMORY : "+(Runtime.getRuntime().maxMemory() / (1024 * 1024)) + "MB");
android.util.Log.d("TAG","FREE MEMORY : "+(Runtime.getRuntime().freeMemory() / (1024 * 1024)) + "MB");
android.util.Log.d("TAG","ALLOCATION MEMORY : "+((Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (1024 * 1024)) + "MB");
도움 부탁 드립니다.
02-14 16:31:03.930: INFO/System.out(6402): Help screen: onCreate...
02-14 16:31:04.020: DEBUG/dalvikvm(6402): GC_EXTERNAL_ALLOC freed 6K, 82% free 3011K/16455K, external 9286K/11161K, paused 27ms
02-14 16:31:04.110: INFO/System.out(6402): Help screen: onResume...
02-14 16:31:04.110: DEBUG/TAG(6402): Native heap size: 40588KB
02-14 16:31:04.110: DEBUG/TAG(6402): Heap Free size : 3640KB
02-14 16:31:04.110: DEBUG/TAG(6402): Heap Allocated size : 16783KB
02-14 16:31:04.110: DEBUG/TAG(6402): TOTAL MEMORY : 16MB
02-14 16:31:04.110: DEBUG/TAG(6402): MAX MEMORY : 32MB
02-14 16:31:04.110: DEBUG/TAG(6402): FREE MEMORY : 13MB
02-14 16:31:04.110: DEBUG/TAG(6402): ALLOCATION MEMORY : 2MB
02-14 16:31:04.190: DEBUG/dalvikvm(6402): GC_EXTERNAL_ALLOC freed 4K, 82% free 3017K/16455K, external 12661K/13209K, paused 27ms
02-14 16:31:04.320: DEBUG/dalvikvm(6402): GC_EXTERNAL_ALLOC freed 1K, 82% free 3017K/16455K, external 14349K/14897K, paused 30ms
02-14 16:31:04.330: ERROR/dalvikvm-heap(6402): 3456000-byte external allocation too large for this process.
02-14 16:31:04.360: ERROR/GraphicsJNI(6402): VM won't let us allocate 3456000 bytes
02-14 16:31:04.360: DEBUG/dalvikvm(6402): GC_FOR_MALLOC freed <1K, 82% free 3017K/16455K, external 14349K/14897K, paused 20ms
02-14 16:31:04.370: DEBUG/AndroidRuntime(6402): Shutting down VM
02-14 16:31:04.370: WARN/dalvikvm(6402): threadid=1: thread exiting with uncaught exception (group=0x40015560)
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): FATAL EXCEPTION: main
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): at android.graphics.Bitmap.nativeCreate(Native Method)
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): at android.graphics.Bitmap.createBitmap(Bitmap.java:477)
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): at android.graphics.Bitmap.createBitmap(Bitmap.java:444)
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:349)
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:498)
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:473)
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336)
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): at android.content.res.Resources.loadDrawable(Resources.java:1709)
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): at android.content.res.Resources.getDrawable(Resources.java:581)
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): at android.view.View.setBackgroundResource(View.java:7533)
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): at onResume(HelpScreen.java:98)
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150)
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): at android.app.Activity.performResume(Activity.java:3832)
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2110)
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2135)
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1668)
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): at android.os.Handler.dispatchMessage(Handler.java:99)
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): at android.os.Looper.loop(Looper.java:123)
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): at android.app.ActivityThread.main(ActivityThread.java:3683)
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): at java.lang.reflect.Method.invokeNative(Native Method)
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): at java.lang.reflect.Method.invoke(Method.java:507)
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-14 16:31:04.370: ERROR/AndroidRuntime(6402): at dalvik.system.NativeStart.main(Native Method)




여유가 있는데 죽을 이유는 없습니다.
try catch 를 잘 이용하시고 위와 같은 경우 메모리 해제를 직접 하셔야 합니다.
리소스 메모리 해제 는 구굴링을 하시면 많은 정보를 얻을 수 있습니다.