Problem releasing activities

by Joan Pujol » Fri, 28 Jan 2011 06:26:15 GMT

Sponsored Links
 've an application that has a service that updates some widgets and
also has some normal foreground activities to let the user view some
My problem is that I discovered [1] that my application consumes a lot
of memory. That memory is mainly consumed by the activities, and the
big problem is that I'm not been able to release the memory of the
activities once they are started.

I've look at various articles about memory leaks and I've tried to
don't retain activity contexts.
I've tried to put a finish() in onPause() of activity to try to force
to release
I've tried to analyze with MAT with dominator tree but it doesn't
shows any class of my app as a dominator.
Also I've tried to analyze one of the activities with MAT, but I don't
see why memory is retained. Here is an extract of ingoing references
to one of the activities:
It seems that all of this references are from the view, or is one of
them suspicious?

| Shallow Heap | Retained Heap
cat.joanpujol.eltemps.PredictionActivity @
0x482b70e0 | 192 | 16.304
|- mContext android.widget.ToggleButton @
0x48195bf8 | 536 | 2.800
|- mContext$DecorView @
0x4819f4b8 | 368 | 696
|- mContext @
0x481a5dc0 | 32 | 56
|- mContext @
0x481a5e08 | 32 | 88
|- [0] java.lang.Object[2] @
0x481a5e30 | 24
| 56
|- mContext android.widget.ScrollView @
0x481b3cc8 | 384 |
|- mCallback, mContext @
0x481c74c8| 176 | 2.320
|- mContext android.widget.FrameLayout @
0x481ce8a8 | 328 | 648
|- mContext android.widget.LinearLayout @
0x481d66a0 | 328 | 5.112
|- referent java.lang.ref.WeakReference @
0x481ef528 | 24 | 24
|- activity$LocalActivityRecord @
0x48226cc0 | 48 | 48
|- mOuterContext @
0x4827ee48 | 152 | 320
|- mContext android.widget.ToggleButton @
0x4828f3a0 | 536 | 2.808
|- mContext android.widget.TextView @
0x48292838 | 504 |
|- mContext android.widget.LinearLayout @
0x4829b620 | 328 | 584
|- mContext android.widget.ToggleButton @
0x482b54e0 | 536 | 2.808
|- mContext android.widget.ImageView @
0x482ca830 | 312 |
'- Total: 17
| |

Some one can give me some ligth?
I'm doing something bad?
Any information or suggerence will be very apreciated.

A lot of thanks in advance,


Re: Problem releasing activities

by JAlexoid (Aleksandr Panzin) » Sat, 29 Jan 2011 00:06:35 GMT

 ry getting the phone memory filed up. So it starts GC'ing and killing
off processes to release the memory. Or try filling up the heap with
total garbage and trigger a GC.
If after that point you actually have the unused(or what you would
expect to become garbage) Activities and Views retained, then you have
a leak.

High mem usage does not mean that there is a leak, by itself.

And to have a low mem usage, you need to carefully create new objects
and hold on to them for a long time. That goes also for Strings,
resources and goes double for Bitmaps.

On 28 , 00:26, Joan Pujol <> wrote:


Sponsored Links

Other Threads

1. How do I point people to my app in the Android Marketplace?

Not sure if this works in mail or websites. I haven't tried.

Ivan Soto Fernandez
Web Developer


2. Some questions about GLThread in ApiDemos

Hi everybody. This is my first post in the group, I hope not the
last :) .

I am working in an OpenGL application, and was analyzing the GLThread
code in ApiDemos in order to define the work loop in my app. I have
some questions about:

1/  In the fragment:

        if(needToWait()) {
                while (needToWait()) {

        , why the if statement?  I guess it could be related with some
synchronization issue, but I am not able to find any scenario where it
is necessary. I think that

        while (needToWait()) {

        would be enough.

2/  I think the member mContextLost is unnecesary. It is set to false
in the GlThread.surfaceCreated() method, at the same time that
mHasSurface is set to true. It is never set to true in all the code.
It is only read at needToWait(), in a logical 'or' operation with !
mHasSurface. I think mHasSurface is enough for the job, am I losing

3/  Why is mEglHelper.finish() called when mPaused is true (this is,
when the onPaused() callback in the ---Activity was called)? The
lifecycle of Activity specifies that onPaused() is called when the
activity is not at foreground. I understand that rendering is blocked
in wait() in this situation, but is it really necessary releasing the
EGL objects and recover them later?

4/  The run() method explains the use of sEglSemaphore in this
     * When the android framework launches a second instance of
     * an activity, the new instance's onCreate() method may be
     * called before the first instance returns from onDestroy().
     * This semaphore ensures that only one instance at a time
     * accesses EGL.

EGL and GL are considered exclusive access resources? I understand
than the GPU is, but what's the problem in having different EGL and GL
contexts in different threads and processes?

Thank you and best regards,

David A. Velasco


3. Interface advice.

4. An interesting dilemma ... advice on dual platform release - Android Market and AppStore

5. Apps labeled as Tetris Clones removed from Android Market

6. An interesting dilemma ... advice on dual platform release - Android Market and AppStore

7. How to center webpage in activity