android createBitmap OOM when ((freeMemory > bitmapSize) && (nativeFreeHeap < bitmap size)) -
on android 2.2, following program produces oom. in summary, program following:
- allocates big array requires native heap grow close maximum size.
- garbage collects array.
- attempts create bitmap of size larger remaining native free heap.
why fail oom? it's if native heap allocate memory bitmaps in memory unallocated.
the output appears below program. in advance.
public class oomtest extends activity { private static final string oom_test = "oomtest"; /** called when activity first created. */ @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); printdiag(); log.i(oom_test, "allocating big int array."); int[] bigintarray = new int[11000000]; printdiag(); bigintarray = null; log.i(oom_test, "garbage collecting."); system.gc(); printdiag(); log.i(oom_test, "creating 4 meg bitmap bitmap."); bitmap bitmap = bitmap.createbitmap(1000, 1000, config.argb_8888); printdiag(); log.i(oom_test, "done."); } private void printdiag() { log.i(oom_test, "maxmemory: " + runtime.getruntime().maxmemory()); log.i(oom_test, "totalmemory: " + runtime.getruntime().totalmemory()); log.i(oom_test, "freememory: " + runtime.getruntime().freememory()); log.i(oom_test, "nativeheapsize: " + android.os.debug.getnativeheapsize()); log.i(oom_test, "nativeheapallocatedsize: " + android.os.debug.getnativeheapallocatedsize()); log.i(oom_test, "nativeheapfreesize: " + android.os.debug.getnativeheapfreesize()); } }
here's output:
i/activitymanager( 2501): start proc com.example.android.oomtest activity com.example.android.oomtest/.oomtest: pid=25242 uid=10031 gids={1015} i/oomtest (25242): maxmemory: 50331648 i/oomtest (25242): totalmemory: 2953200 i/oomtest (25242): freememory: 479512 i/oomtest (25242): nativeheapsize: 3600384 i/oomtest (25242): nativeheapallocatedsize: 3585800 i/oomtest (25242): nativeheapfreesize: 14584 i/oomtest (25242): allocating big int array. d/dalvikvm(25242): gc_for_malloc freed 634 objects / 51344 bytes in 48ms i/dalvikvm-heap(25242): grow heap (frag case) 44.573mb 44000016-byte allocation d/dalvikvm(25242): gc_for_malloc freed 34 objects / 1992 bytes in 60ms i/oomtest (25242): maxmemory: 50331648 i/oomtest (25242): totalmemory: 46997472 i/oomtest (25242): freememory: 575224 i/oomtest (25242): nativeheapsize: 3600384 i/oomtest (25242): nativeheapallocatedsize: 3578408 i/oomtest (25242): nativeheapfreesize: 23560 i/oomtest (25242): garbage collecting. d/dalvikvm(25242): gc_explicit freed 65 objects / 44002952 bytes in 52ms i/oomtest (25242): maxmemory: 50331648 i/oomtest (25242): totalmemory: 46997472 i/oomtest (25242): freememory: 44576440 i/oomtest (25242): nativeheapsize: 3600384 i/oomtest (25242): nativeheapallocatedsize: 3575784 i/oomtest (25242): nativeheapfreesize: 24600 i/oomtest (25242): creating 4 meg bitmap bitmap. e/dalvikvm-heap(25242): 4000000-byte external allocation large process. e/graphicsjni(25242): vm won't let allocate 4000000 bytes d/androidruntime(25242): shutting down vm w/dalvikvm(25242): threadid=1: thread exiting uncaught exception (group=0x4001d7d0) e/androidruntime(25242): fatal exception: main e/androidruntime(25242): java.lang.outofmemoryerror: bitmap size exceeds vm budget e/androidruntime(25242): @ android.graphics.bitmap.nativecreate(native method) e/androidruntime(25242): @ android.graphics.bitmap.createbitmap(bitmap.java:468) e/androidruntime(25242): @ com.example.android.oomtest.oomtest.oncreate(oomtest.java:26)
i think you're deep undocumented behavior here-- wouldn't able count on answer being consistent across different android versions or devices.
my guess system granting app maximum process size. process size consists of dalvik heap , native heap (plus overhead, of course). you've expanded dalvik heap maximum. garbage collecting created space in dalvik heap, process's space allocated dalvik heap , therefore unavailable native heap, there isn't room in native heap accomodate bitmap object.
i'm behavior differed in previous (or other?) releases of android, dalvik heap not expand beyond half of total process size limit.
Comments
Post a Comment