The heap works pretty much like in a regular VM. As your app needs
more memory the heap grows accordingly (but doesn't shrink.) For
instance, if you are using 1 MB out of your 2 MB of allocated heap and
need to load 2 more MB, the heap will grow to more than 3 MB, and you
will use 3 MB out of the heap. But when the heap reaches a total
allocated size of 16 MB and your app needs more memory, you get an
OutOfMemoryError.

On Wed, Dec 3, 2008 at 11:30 PM, EboMike <[EMAIL PROTECTED]> wrote:
>
> Thanks, Romain. I'm grabbing them from a server, but you're right, if
> anything, I should convert and re-save them in a smaller format before
> caching them locally. Well, I just tried to get it running quickly :)
>
> One laaast thing - You mentioned that an app has a 16MB heap. How is
> that split up? A Runtime.getRuntime().freeMemory() right on startup in
> the app above gives me about 800KB or so (although the app is later
> able to allocate 1MB to decode an image). I'm not very familiar with
> Dalvik's memory management, how is the whole thing set up?
>
> -Mike
>
>
> On Dec 3, 11:26 pm, Romain Guy <[EMAIL PROTECTED]> wrote:
>> Well you could start by not loading such huge images in a Gallery.
>> Even if the recycler was working correctly it is a LOT of data to read
>> and to decode. It's also a lot of wasted memory (and it also slows
>> drawing down since the bitmaps are drawn rescaled.) You should use
>> BitmapFactory.Options or Bitmap.createScaledBitmap to load your image
>> pre-scaled to a much more reasonable size.
>>
>>
>>
>> On Wed, Dec 3, 2008 at 11:23 PM, EboMike <[EMAIL PROTECTED]> wrote:
>>
>> > Thanks a lot for the very quick replies. One last thing: Do you happen
>> > to have any remote idea about when the next SDK release is scheduled?
>> > My app is currently running out of memory a lot :)
>>
>> > On Dec 3, 11:13 pm, Romain Guy <[EMAIL PROTECTED]> wrote:
>> >> A memory leak is actually totally expected in that case. Gallery, like
>> >> ListView, GridView, etc. uses a recycling heap. Every time a view is
>> >> unused, it is moved to the recycler. Unfortunately, if it's never
>> >> taken out of the recycler...
>>
>> >> On Wed, Dec 3, 2008 at 11:07 PM, EboMike <[EMAIL PROTECTED]> wrote:
>>
>> >> > Thanks a lot, Romain! Question though - even if the gallery is not
>> >> > converting the views, why doesn't it release references to them as you
>> >> > move away?
>>
>> >> > Say, I move from view 0 to view 1, with view 0 being completely off-
>> >> > screen, the gallery should remove its reference to view 0 since it is
>> >> > no longer needed, and thus allow the gc to free up any memory it
>> >> > holds. In fact, when I go back to view 0, I can see that a new view is
>> >> > created. So what happened to the old view 0? Even with view conversion
>> >> > not working, there shouldn't be memory leaks.
>>
>> >> > -Mike
>>
>> >> > On Dec 3, 11:04 pm, Romain Guy <[EMAIL PROTECTED]> wrote:
>> >> >> I just checked and the bug is simply that Gallery does not convert the
>> >> >> views. I'll try to fix it as soon as possible.
>>
>> >> >> On Wed, Dec 3, 2008 at 10:45 PM, EboMike <[EMAIL PROTECTED]> wrote:
>>
>> >> >> > I've already asked this in <a href="http://groups.google.com/group/
>> >> >> > android-developers/msg/9cdbf47be2505810?hl=en">This thread</a>: Here
>> >> >> > is a pretty simple Gallery setup. It seems to leak with every image
>> >> >> > that's loaded (see the original thread for details).
>>
>> >> >> > I'm tempted to file it as a bug, but I want to mention it here first
>> >> >> > to make sure I'm not just making a simple mistake in my usage of the
>> >> >> > Gallery. Also (as mentioned in another thread), convertView is always
>> >> >> > null -- the Gallery never seems to recycle any views. Why?
>>
>> >> >> > To make this run, you will need to put a JPG file into the data 
>> >> >> > folder
>> >> >> > (see code).
>>
>> >> >> > package ebomike.memorytest;
>>
>> >> >> > import android.app.Activity;
>> >> >> > import android.content.Context;
>> >> >> > import android.graphics.Bitmap;
>> >> >> > import android.graphics.BitmapFactory;
>> >> >> > import android.graphics.drawable.BitmapDrawable;
>> >> >> > import android.os.Bundle;
>> >> >> > import android.util.Log;
>> >> >> > import android.view.View;
>> >> >> > import android.view.ViewGroup;
>> >> >> > import android.widget.BaseAdapter;
>> >> >> > import android.widget.Gallery;
>> >> >> > import android.widget.ImageView;
>>
>> >> >> > public class MemoryTest extends Activity {
>>
>> >> >> >        Gallery g;
>>
>> >> >> >    /** Called when the activity is first created. */
>> >> >> >    @Override
>> >> >> >    public void onCreate(Bundle savedInstanceState) {
>>
>> >> >> >                String filePath;
>>
>> >> >> >                // NOTE: Make this point to a JPEG file.
>> >> >> >                filePath = getFilesDir().getPath();
>> >> >> >                filePath += "/TEST_IMAGE.jpg";
>>
>> >> >> >        super.onCreate(savedInstanceState);
>> >> >> >        setContentView(R.layout.main);
>>
>> >> >> >        g = (Gallery) findViewById(R.id.Gallery01);
>> >> >> >        g.setAdapter(new FullImageAdapter(this, filePath));
>> >> >> >    }
>>
>> >> >> >    class FullImageAdapter extends BaseAdapter
>> >> >> >    {
>> >> >> >        Context context;
>> >> >> >        String path;
>>
>> >> >> >        FullImageAdapter(Context c, String path)
>> >> >> >        {
>> >> >> >                context = c;
>> >> >> >                this.path = path;
>> >> >> >        }
>>
>> >> >> >        public int getCount()
>> >> >> >        {
>> >> >> >                return 1024;
>> >> >> >        }
>>
>> >> >> >        public int getViewTypeCount()
>> >> >> >        {
>> >> >> >                return 1;
>> >> >> >        }
>>
>> >> >> >        public boolean hasStableIds()
>> >> >> >        {
>> >> >> >                return true;
>> >> >> >        }
>>
>> >> >> >        public int getItemViewType(int position)
>> >> >> >        {
>> >> >> >                return 0;
>> >> >> >        }
>>
>> >> >> >        public View getView(int position, View convertView, ViewGroup
>> >> >> > parent)
>> >> >> >        {
>> >> >> >                ImageView view;
>>
>> >> >> >                if (convertView != null)
>> >> >> >                {
>> >> >> >                        // Note that we never get here. Why?
>> >> >> >                        view = (ImageView) convertView;
>> >> >> >                }
>> >> >> >                else
>> >> >> >                {
>> >> >> >                        view = new ImageView(context);
>> >> >> >                }
>>
>> >> >> >                Bitmap bitmap = BitmapFactory.decodeFile(path);
>> >> >> >                BitmapDrawable drawable = new BitmapDrawable(bitmap);
>> >> >> >                view.setImageDrawable(drawable);
>>
>> >> >> >                return view;
>> >> >> >        }
>>
>> >> >> >        public Object getItem(int position)
>> >> >> >        {
>> >> >> >                return position;
>> >> >> >        }
>>
>> >> >> >        public long getItemId(int position)
>> >> >> >        {
>> >> >> >                return position;
>> >> >> >        }
>> >> >> >    }
>> >> >> > }
>>
>> >> >> > The layout:
>>
>> >> >> > <?xml version="1.0" encoding="utf-8"?>
>> >> >> > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/
>> >> >> > android"
>> >> >> >    android:orientation="vertical"
>> >> >> >    android:layout_width="fill_parent"
>> >> >> > android:layout_height="fill_parent">
>> >> >> > <TextView
>> >> >> >    android:layout_width="fill_parent"
>> >> >> >    android:layout_height="wrap_content"
>> >> >> >    android:text="@string/hello"
>> >> >> >    />
>> >> >> > <Gallery android:id="@+id/Gallery01"
>> >> >> > android:layout_width="fill_parent"
>> >> >> > android:layout_height="fill_parent"></Gallery>
>>
>> >> >> > </LinearLayout>
>>
>> >> >> --
>> >> >> Romain Guywww.curious-creature.org
>>
>> >> --
>> >> Romain Guywww.curious-creature.org
>>
>> --
>> Romain Guywww.curious-creature.org
> >
>



-- 
Romain Guy
www.curious-creature.org

--~--~---------~--~----~------------~-------~--~----~
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
[EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to