I'm still seeing this problem as well. I can boot my phone, start my
app, load a single image (~300k) and have this error. I'm loading
images with the BitmapFactory.decodeByteArray() method, which calls
BitmapFactory.nativeDecodeByteArray().

What is interesting is that after I added a background thread to my
app to load and process images, I had a bug where changing the
orientation of the screen caused another thread to be started. As soon
as two of my threads were in BitmapFactory.nativeDecodeByteArray() at
the same time, this method would attempt to allocate over 6MB of
memory, and I would get the error.

E/dalvikvm-heap( 1204): 6291456-byte external allocation too large for
this process.
E/        ( 1204): VM won't let us allocate 6291456 bytes
D/skia    ( 1204): xxxxxxxxxxxxxxxxxxxx allocPixelRef failed
W/dalvikvm( 1204): threadid=15: thread exiting with uncaught exception
(group=0x40013e28)
E/AndroidRuntime( 1204): Uncaught handler: thread Thread-12 exiting
due to uncaught exception
E/AndroidRuntime( 1204): java.lang.OutOfMemoryError: bitmap size
exceeds VM budget
E/AndroidRuntime( 1204):        at
android.graphics.BitmapFactory.nativeDecodeByteArray(Native Method)
E/AndroidRuntime( 1204):        at
android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:234)
E/AndroidRuntime( 1204):        at
android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:247)
E/AndroidRuntime( 1204):        at
org.hopto.group18.postbot.Image.loadFileContents(Image.java:85)
E/AndroidRuntime( 1204):        at org.hopto.group18.postbot.EditPost$20.run
(EditPost.java:800)
E/AndroidRuntime( 1204):        at java.lang.Thread.run(Thread.java:935)

I'm using 500k buffers (down from 1MB, down from 1.5MB in an effort to
avoid OOMEs) to load images, the images themselves are ~300k (taken
with the phone's camera). I can't imagine why it is trying to allocate
6MB.

I have fixed my thread issue (even when not changing orientation this
issue occurs), and I am using locking to prevent two of my threads
from using this method at the same time, but I still see this error,
although less frequently.

It seems to come and go: sometimes I can't seem to load a single image
for a period of a minute or two, and then the problem will go away. Is
it possible that these errors can be the result of concurrent access
to this native method by my app and other apps?

On Jan 8, 7:05 pm, Mark K <mark.ka...@gmail.com> wrote:
>   I'm still seeing this problem. I've used the bitmap.recycle() which
> seems to mitigate this problem, but not get rid if it entirely. I'm
> only processing one bitmap at a time, I recycle the bitmap, null it,
> and call gc().  Runtime.freeMemory() indicates that I have over 10 MB
> free memory, none of my bitmaps are over 3.5 MB, I only process one at
> a time, yet this problem still occurs intermittently. Is this a bug or
> low level memory leak? I've spent a considerable amount of time on
> this issue, but cannot seem to resolve it. I'd at least like to know
> if this is a documented bug, or if there is any hope of a resolution
> in future Android version. The problem seems to arise from
> BitmapFactory.decodeFile() . I've communicated with other developers
> that seem to have almost the exact same problem. I'd like to at least
> know if this is on the radar as a bug, and if there is any chance it
> will be dealt with in a future version of Android. Thanks
>
>                                                          Mark
>
> On Jan 8, 3:29 pm, Romain Guy <romain...@google.com> wrote:
>
> > Use less memory. One full screen PNG uses roughly 480*320*4 bytes (~=
> > 614k.) Since you enable caching, you are doubling that amount to
> > ~1.2MB per view. With 5 views you are using about 6 MB of memory (out
> > of 16 MB maximum) just for the background images.
>
> > On Thu, Jan 8, 2009 at 3:27 PM, Rohit <mord...@gmail.com> wrote:
>
> > > I am setting the Background (using view.setBackgroundResource()) of
> > > about 5 views with pngs that fill up the entire screen (as a
> > > backdrop). I scroll between these 5 views and thus want to keep them
> > > in cache (I use view.setChildrenCacheEnabled()) but I run into the
> > >OutOfMemoryError: bitmap exceeds VM budget error. Is there a way to
> > > overcome it?
>
> > > Rohit
>
> > > n Dec 17 2008, 11:20 am, Mark K <mark.ka...@gmail.com> wrote:
> > >> Thanks for the beta on the bitmap,recycle(), it works! Before
> > >> processing the next bitmap I use this code to free up memory. I have a
> > >> class level Bitmap object.
>
> > >>                                 Bitmap bm;// class level
>
> > >>                                 if (bm!=null)
> > >>                 {
> > >>                          bm.recycle();
> > >>                          try
> > >>                          {
> > >>                                 Thread.sleep(100);
> > >>                          }
> > >>                          catch(Exception e){}
> > >>                          bm=null;
> > >>                          System.gc();
> > >>                          try
> > >>                          {
> > >>                                 Thread.sleep(100);
> > >>                          }
> > >>                          catch(Exception e){}
> > >>                 }
> > >>                                // create new bitmap and start again.
>
> > >> Thanks again, it works!
>
> > >> On Dec 17, 5:56 am, Mike Reed <r...@google.com> wrote:
>
> > >> > Its a little raw, but if you know you're absolutely done using a given
> > >> > bitmap object, you can call bitmap.recycle(). This immediately frees
> > >> > up the memory associated with the bitmap, and marks it as "dead",
> > >> > meaning it cannot be referenced again (i.e. don't try to draw or get/
> > >> > set its pixels anymore).
>
> > >> > i.e.
>
> > >> > for (all of my big images) {
> > >> >      Bitmap b = decode(...);
> > >> >      canvas.drawBitmap(b, ...);
> > >> >      b.recycle();
> > >> >      // yikes, don't reference b again)
>
> > >> > }
>
> > >> > On Dec 15, 2008, at 9:04 PM, Mark K wrote:
>
> > >> >   Is there a work around for this problem? Something I need to do
> > >> > differently perhaps? It seems like garbage collection is not occurring
> > >> > between successive bitmap decoding operations. Explicitly calling gc()
> > >> > does not seem to help. This is particularly a problem on the G1,
> > >> > because there is no way to reduce the camera resolution, all of the
> > >> > camera pictures are large. If I loop through a directory of pictures
> > >> > taken by the camera and use BitmapFactory.decodeFile(), I will get an
> > >> > out of memory error on the 2nd or 3rd iteration. Since I am only
> > >> > displaying/decoding one bitmap at a time I would hope that garbage
> > >> > collection would free up the memory between operations such that this
> > >> > does not occur. Any help would be greatly appreciated. Here's the code
> > >> > I use: This code runs a slide show of the images in the camera
> > >> > directory, it uses Handler.postDelayed() to render each picture. Is
> > >> > there anyway to tweak the code to get rid of the out of memory
> > >> > problem.
>
> > >> > public boolean slideShow()
> > >> >     {
> > >> >         String baseDir = "/sdcard/dcim/Camera/";
> > >> >         long showTime = 1500;
>
> > >> >         File dir = new File(baseDir);
> > >> >         File[] pics = dir.listFiles();
> > >> >         for ( int i=0; i<pics.length; i++ )
> > >> >         {
> > >> >                 String pic=baseDir+pics[i].getName();
> > >> >                 handler.postDelayed(new ShowSlide(pic), i*showTime);
> > >> >         }
> > >> >         return true;
> > >> >     }
>
> > >> > class ShowSlide extends Thread
> > >> >     {
> > >> >         String pc="";
> > >> >         public ShowSlide(String pc)
> > >> >         {
> > >> >                 this.pc=pc;
> > >> >         }
> > >> >         public void run()
> > >> >         {
> > >> >                 System.out.println("Showing picture: "+pc.toString());
> > >> >                 displayPicture(pc);
> > >> >         }
> > >> >     }
>
> > >> > public boolean displayPicture(String filepath)
> > >> >     {
> > >> >                File file = new File(filepath);
> > >> >                 BitmapFactory bfac = new BitmapFactory();
> > >> >         try
> > >> >         {
> > >> >                 bm = bfac.decodeFile(filepath);// out of memory error 
> > >> > occurs
> > >> > here!
> > >> >                 handler.post(new SetImage(iView, bm));
> > >> >         }
> > >> >         catch(Exception e)
> > >> >         {
> > >> >            Log.e(TAG,"display picture failed: "+filepath+" "+e.toString
> > >> > ());
> > >> >            e.printStackTrace();
> > >> >            return false;
> > >> >         }
>
> > >> >         return true;
> > >> >     }
>
> > >> > class SetImage extends Thread
> > >> >     {
> > >> >         ImageView vv;
> > >> >         Bitmap bb;
> > >> >         public SetImage(ImageView vv, Bitmap bb)
> > >> >         {
> > >> >                 this.vv=vv;
> > >> >                 this.bb=bb;
> > >> >         }
> > >> >         public void run()
> > >> >         {
> > >> >                 vv.setImageBitmap(bb);
> > >> >         }
> > >> >     }
>
> > >> > On Dec 15, 2:48 pm, Romain Guy <romain...@google.com> wrote:
>
> > >> > >>  I've run into this exact same problem a number of times myself. Not
> > >> > >> sure if its a bug or just a limitation of the jvm, can't seem to
> > >> > >> process more than a few large bitmaps without this occuring, this
> > >> > >> always seems to occur when decoding bitmaps from file.
>
> > >> > > Neither, you are just using too much memory.
>
> > >> > > --
> > >> > > Romain Guy
> > >> > > Android framework engineer
> > >> > > romain...@android.com
>
> > >> > > Note: please don't send private questions to me, as I don't have time
> > >> > > to provide private support.  All such questions should be posted on
> > >> > > public forums, where I and others can see and answer them- Hide 
> > >> > > quoted text -
>
> > >> > - Show quoted text -
>
> > --
> > Romain Guy
> > Android framework engineer
> > romain...@android.com
>
> > Note: please don't send private questions to me, as I don't have time
> > to provide private support.  All such questions should be posted on
> > public forums, where I and others can see and answer them- Hide quoted text 
> > -
>
> > - Show quoted text -
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers-unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to