Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Lots of garbage collection in a listview

Tags:

I have a ListView that uses a custom adapter. The custom adapter's getView uses all the recommended practices:

@Override public View getView(int position, View convertView, ViewGroup parent) {     SuscriptionsViewsHolder holder;     ItemInRootList item = mItemsInList.get(position);      if (convertView == null) {          convertView = mInflater.inflate(R.layout.label, null);           holder = new SuscriptionsViewsHolder();          holder.label = (TextView) convertView.findViewById(R.id.label_label);          holder.icon = (ImageView) convertView.findViewById(R.id.label_icon);          convertView.setTag(holder);     } else {         holder = (SuscriptionsViewsHolder) convertView.getTag();     }      String text = String.format("%1$s (%2$s)", item.title, item.unreadCount);     holder.label.setText(text);     holder.icon.setImageResource(item.isLabel ? R.drawable.folder : R.drawable.file );      return convertView; } 

However when I scroll, it is sluggish because of heavy garbage collection:

GC_EXTERNAL_ALLOC freed 87K, 48% free 2873K/5447K, external 516K/519K, paused 30ms GC_EXTERNAL_ALLOC freed 7K, 48% free 2866K/5447K, external 1056K/1208K, paused 29ms GC_EXTERNAL_ALLOC freed <1K, 48% free 2866K/5447K, external 1416K/1568K, paused 28ms GC_EXTERNAL_ALLOC freed 5K, 48% free 2865K/5447K, external 1600K/1748K, paused 27ms GC_EXTERNAL_ALLOC freed <1K, 48% free 2865K/5447K, external 1780K/1932K, paused 30ms GC_EXTERNAL_ALLOC freed 2K, 48% free 2870K/5447K, external 1780K/1932K, paused 26ms GC_EXTERNAL_ALLOC freed 2K, 48% free 2870K/5447K, external 1780K/1932K, paused 25ms GC_EXTERNAL_ALLOC freed <1K, 48% free 2870K/5447K, external 1780K/1932K, paused 26ms GC_EXTERNAL_ALLOC freed 3K, 48% free 2870K/5447K, external 1780K/1932K, paused 25ms GC_EXTERNAL_ALLOC freed <1K, 48% free 2870K/5447K, external 1780K/1932K, paused 29ms GC_EXTERNAL_ALLOC freed <1K, 48% free 2870K/5447K, external 1780K/1932K, paused 29ms GC_EXTERNAL_ALLOC freed <1K, 48% free 2871K/5447K, external 1780K/1932K, paused 28ms GC_EXTERNAL_ALLOC freed <1K, 48% free 2871K/5447K, external 1780K/1932K, paused 26ms GC_EXTERNAL_ALLOC freed <1K, 48% free 2870K/5447K, external 1780K/1932K, paused 27ms GC_EXTERNAL_ALLOC freed <1K, 48% free 2870K/5447K, external 1780K/1932K, paused 29ms GC_EXTERNAL_ALLOC freed <1K, 48% free 2870K/5447K, external 1780K/1932K, paused 26ms GC_EXTERNAL_ALLOC freed <1K, 48% free 2870K/5447K, external 1780K/1932K, paused 34ms 

What seems to be wrong?

EDIT @12:47 GMT:

In fact it's slightly more complicated than this. My app UI is based on 2 parts. One is the brain of a screen, creating the views, handling user input, etc. The other is a Fragment if the device has android 3.0, otherwise it's an Activity.

The GC happened on my Nexus One 2.3.3 device, so using the Activity. I don't have my Xoom with me to test the behaviour with a Fragment.

I could post the source if required, but let me try to explain it :

  • RootList is the brain of the UI. It contains :
    • a List<> of items that will be placed in the ListView.
    • a method that builds this list from a SQLite db
    • a custom BaseAdapter that contains basically only the getView method pasted above
  • RootListActivity is a ListActivity, which:
    • uses an XML layout
    • the layout has of course a listview with id android.id.list
    • the Activity callbacks are forwarded to the RootList class using an instance of RootList created when the activity is created (constructor, not onCreate)
    • in the onCreate, I call RootList's methods that will create the list of items, and set the list data to a new instance of my custom class derived from BaseAdapter

EDIT on may 17th @ 9:36PM GMT:

Here's the code of the Activity and the class that does the things. http://pastebin.com/EgHKRr4r

like image 792
Benoit Duffez Avatar asked May 12 '11 12:05

Benoit Duffez


People also ask

What is included in garbage collection services?

Garbage collection services refers to the collection and removal of waste that cannot be recycled or reused. For this exercise, waste disposal services (such as landfill site operations) were not included in calculations. Waste diversion programs (such as recycling) were also separated and the benchmarking results are presented here.

When is the last time a garbage collection finished?

Assuming the worst case, the last garbage collection was for a generation 0 collection that finished at the start of the second interval, and the generation 2 garbage collection finished at the end of the fifth interval.

How do I check how many objects were handled during garbage collection?

The garbage collector must go through a large amount of memory if many objects remain to be collected. The work to compact the survivors is time-consuming. To determine how many objects were handled during a collection, set a breakpoint in the debugger at the end of a garbage collection for a specified generation.

Are garbage collection costs included in the cost of garbage collection?

Some cities have included the cost of waste disposal in their costs of garbage collection, whereas other cities have not. Waste disposal facilities are the single most expensive component of the waste program and these costs continue to increase as environmental regulations become more stringent.


1 Answers

I found the issue. My XML layout for the activity was:

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="fill_parent"     android:layout_height="fill_parent">      <include android:id="@+id/rootlist_header" layout="@layout/pre_honeycomb_action_bar" />      <ListView android:id="@android:id/list"         android:layout_below="@id/rootlist_header"         android:layout_width="fill_parent"         android:layout_height="fill_parent"         android:layout_weight="1"         android:textColor="#444444"         android:divider="@drawable/list_divider"         android:dividerHeight="1px"         android:cacheColorHint="#00000000" />  </RelativeLayout> 

If I remove the android:cacheColorHint="#00000000", the heavy GC is out, and the scrolling is smooth! :)

I don't really know why this parameter was set, because I don't need it. Maybe I copypasted too much instead of actually build my XML layout.

THANK YOU for your support, I really appreciate your help.

like image 191
Benoit Duffez Avatar answered Sep 30 '22 07:09

Benoit Duffez