What Android tools and methods work best to find memory/resource leaks? [closed] What Android tools and methods work best to find memory/resource leaks? [closed] android android

What Android tools and methods work best to find memory/resource leaks? [closed]


One of the most common errors that I found developing Android Apps is the “java.lang.OutOfMemoryError: Bitmap Size Exceeds VM Budget” error. I found this error frecuently on activities using lots of bitmaps after changing orientation: the Activity is destroyed, created again and the layouts are “inflated” from the XML consuming the VM memory avaiable for bitmaps.

Bitmaps on the previous activity layout are not properly deallocated by the garbage collector because they have crossed references to their activity. After many experiments I found a quite good solution for this problem.

First, set the “id” attribute on the parent view of your XML layout:

<?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"     android:id="@+id/RootView"     >     ...

Then, on the onDestroy() method of your Activity, call the unbindDrawables() method passing a refence to the parent View and then do a System.gc()

@Overrideprotected void onDestroy() {    super.onDestroy();    unbindDrawables(findViewById(R.id.RootView));    System.gc();}private void unbindDrawables(View view) {    if (view.getBackground() != null) {        view.getBackground().setCallback(null);    }    if (view instanceof ViewGroup) {        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {            unbindDrawables(((ViewGroup) view).getChildAt(i));        }        ((ViewGroup) view).removeAllViews();    }}

This unbindDrawables() method explores the view tree recursively and:

  1. Removes callbacks on all the background drawables
  2. Removes childs on every viewgroup


Mostly for Google travelers from the future:

Most java tools are unfortunately unsuitable for this task, because they only analyze the JVM-Heap. Every Android Application also has a native heap, though, which also has to fit within the ~16 MB limit. It's usually used for bitmap data, for example. So you can run quite easily into Out Of Memory errors even though your JVM-Heap is chillin around 3 MBs, if you use a lot of drawables.