Android Memory Leak Analysis Guide 80 NJ221 1

User Manual: Pdf

Open the PDF directly: View PDF PDF.
Page Count: 55

DownloadAndroid Memory Leak Analysis Guide 80 NJ221 1
Open PDF In BrowserView PDF
Android Memory Leak Analysis Guide
80-NJ221-1 A

Confidential and Proprietary – Qualcomm Technologies, Inc.
Restricted Distribution: Not to be distributed to anyone who is not an employee of either Qualcomm or its subsidiaries without the express approval of Qualcomm’s Configuration Management.

Confidential and Proprietary – Qualcomm Technologies, Inc.

Confidential and Proprietary – Qualcomm Technologies, Inc.
NO PUBLIC DISCLOSURE PERMITTED: Please report postings of this document on public servers or websites to: DocCtrlAgent@qualcomm.com.
Restricted Distribution: Not to be distributed to anyone who is not an employee of either Qualcomm or its subsidiaries without the express approval of Qualcomm’s
Configuration Management.
Not to be used, copied, reproduced, or modified in whole or in part, nor its contents revealed in any manner to others without the express written permission of
Qualcomm Technologies, Inc.
Qualcomm reserves the right to make changes to the product(s) or information contained herein without notice. No liability is assumed for any damages arising directly
or indirectly by their use or application. The information provided in this document is provided on an “as is” basis.
This document contains confidential and proprietary information and must be shredded when discarded.
Qualcomm is a trademark of QUALCOMM Incorporated, registered in the United States and other countries. All QUALCOMM Incorporated trademarks are used with
permission. Other product and brand names may be trademarks or registered trademarks of their respective owners.
This technical data may be subject to U.S. and international export, re-export, or transfer (“export”) laws. Diversion contrary to U.S. and international law is strictly
prohibited.
Qualcomm Technologies, Inc.
5775 Morehouse Drive
San Diego, CA 92121
U.S.A.
© 2013 Qualcomm Technologies, Inc.
All rights reserved.

PAGE 2

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

Revision History

Revision

Date

A

Jul 2013

Description
Initial release

Note: There is no Rev. I, O, Q, S, X, or Z per Mil. standards.

PAGE 3

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

Contents








Objectives
What’s Memory Leak?
What’s Memory Leak Dump?
DDMS Memory Tool
MAT(Memory Analyzer Tool)
References
Questions?

PAGE 4

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

Objectives


At the end of this presentation, you will understand:



What memory leak is.
What memory leak dump is and how to get it.







PAGE 5

HPROF Binary Heap Dumps
What Garbage Collection Roots(GC roots) is
How to get memory leak dump for Android

What DDMS memory tool is and how to use it to detect memory leak.
What MAT is and how to use it to analyze memory leak.

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

What’s Memory Leak

PAGE 6

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

What’s Memory Leak



In computer science, a memory leak occurs when a computer program
incorrectly manages memory allocations.
In object-oriented programming, a memory leak may happen when an
object is stored in memory but cannot be accessed by the running code.

PAGE 7

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

What’s Memory Leak for Android




For Android (Java), "memory leak" in your code is when you keep a
reference to an object that is no longer needed. Sometimes a single
reference can prevent a large set of objects from being collected as
garbage.
The memory allocated by Android application can be retrieved by the
Dalvik (Android process virtual machine) after the application exits. So
even the application has memory leak, after the application exits, the
leaked memory also can be retrieved.

PAGE 8

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

What’s Memory Leak for Android






If the Android application needs to run for a long time without exiting, or
the application needs to allocate large memory, the memory leak will be a
problem.
Every Android application is running in a separate thread. And every
application has the memory limitation.
If the used memory is near the limitation, out of memory will appear, the
application will be killed.
There are two most common memory leak types.




PAGE 9

The first one is a static reference to a non-static inner class, which will keep a
reference to the Activity and prevent it from being GC. Upon every screen
orientation change, the onCreate method will be invoked and a new MainActivity
instance will be created. Due to old references, the old Activities will not be
collected as garbage .
The second case is known as a “context leak”. This case is hard to spot as the
main issue lies within the application’s context passed to a static class that
keeps it as a field – which of course is a hard reference.

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

What’s Memory Leak Dump

PAGE 10

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

What’s Memory Leak Dump





A memory dump is a snapshot of the memory of a Java process at a
certain point of time.
There are different formats for persisting this data. Depending on the
format, it may contain different pieces of information. But in general the
snapshot contains information about the java objects and classes in the
memory at the moment the snapshot is triggered.
As it is just a snapshot at a given moment, a memory dump does not
contain information such as when and where (in which method) an object
is allocated.

PAGE 11

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

HPROF Binary Heap Dumps







Information about all loaded classes. For every class, the HPROF dump
contains its name, its super-class, its class loader, the defined fields for
the instances (name and type), the static fields of the class and their
values.
Information about all objects. For every object, one can find the class and
the values of all fields – both references and primitive fields. The
possibility to look at the names and the content of certain objects, e.g. the
char[ ] within a huge StringBuilder, the size of a collection, etc. can be
very helpful when performing memory analysis
A list of GC roots.
The call stacks of all threads.

PAGE 12

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

What’s Garbage Collection Roots (GC roots)





The Garbage Collector (GC) is responsible for removing objects that will
never be accessed.
Objects cannot be accessed if they are not reachable through any
reference chain.
The starting point of this analysis is the Garbage Collection Roots, i.e.
objects that are assumed reachable by the virtual machine itself.
Objects that are reachable from the GC roots remain in memory, objects
that are not reachable are garbage collected.

PAGE 13

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

What’s Garbage Collection Roots(GC roots)




Common GC Roots are objects on the call stack of the current thread (e.g.
method parameters and local variables), the thread itself, classes loaded
by the system class loader and objects kept alive due to native code.
GC Roots are very important when determining why an object is still kept
in memory: The reference chain from an arbitrary object to the GC roots
(Path to GC Roots...) tells who accidentally keeps a reference.

PAGE 14

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

How to Get Memory Dump?


We can get the *.hprof (memory dump file) with one of the ways below:







PAGE 15

In DDMS, select ‘Update Heap’ and ‘Dump HPROF file’ can get the *.hprof file.
Call the function ‘adroid.os.Debug.dumpHprofData("/data/temp/myapp.hprof");’
can save the *.hprof file to a folder in the device.
Dalvik VM will dump hprof file within /data/misc folder if SIGUSR1 and/or
SIGQUIT signal is received. Manually send SIGUSR1 to process: kill -10 pid.
(Before Android 2.3)
The Android provides monkey tool (random testing tool), with --hprof option will
generate hprof file within /data/misc folder.
The folder /data/misc shall have 777 permissions.

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

How to Get Memory Dump?

PAGE 16

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

How to Get Memory Dump?


If the *.hprof can’t be recognize by the MAT(Memory Analyzer Tool), we
need to convert it as below:
sdk\tools\hprof-conv a.hprof b.hprof
Now the ‘b.hprof’ can be used in the MAT.
‘hprof-conv’ is a tool including in Android SDK.

PAGE 17

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

DDMS Memory Tool

PAGE 18

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

DDMS Memory Tool


Android ships with a debugging tool called the Dalvik Debug Monitor
Server (DDMS), which provides port-forwarding services, screen capture
on the device, thread and heap information on the device, logcat, process,
and radio state information, incoming call and SMS spoofing, location data
spoofing, and more.

PAGE 19

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

Viewing Heap Usage for a Process


DDMS allows you to view how much heap memory a process is using.
This information is useful in tracking heap usage at a certain point of time
during the execution of your application.



To view heap usage for a process:
1)

2)
3)

4)

PAGE 20

In the Devices tab, select the process that you want to see the heap
information for.
Click the Update Heap button to enable heap information for the process.
In the Heap tab, click Cause GC to invoke garbage collection, which enables
the collection of heap data. When the operation completes, you will see a
group of object types and the memory that has been allocated for each type.
You can click Cause GC again to refresh the data.
Click on an object type in the list to see a bar graph that shows the number of
objects allocated for a particular memory size in bytes.

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

Viewing Heap Usage for a Process

PAGE 21

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

Viewing Heap Usage for a Process



In this heap view, there is a type called ‘data object’, we should pay
attention to the ‘Total Size’ of this type.
We can make different operations in our application and check the size.



PAGE 22

If there is no memory leak, the size will keep in a range.
If the size increases continuously, there should be memory leak.

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

Tracking Memory Allocation of Objects




DDMS provides a feature to track objects that are being allocated to
memory and to see which classes and threads are allocating the objects.
This allows you to track, in real time, where objects are being allocated
when you perform certain actions in your application. This information is
valuable for assessing memory usage that can affect application
performance.
To track memory allocation of objects:
1)
2)

3)

4)
5)

PAGE 23

In the Devices tab, select the process that you want to enable allocation
tracking for.
In the Allocation Tracker tab, click the Start Tracking button to begin
allocation tracking. At this point, anything you do in your application will be
tracked.
Click Get Allocations to see a list of objects that have been allocated since
you clicked on the Start Tracking button. You can click on Get
Allocations again to append to the list new objects that that have been
allocated.
To stop tracking or to clear the data and start over, click the Stop Tracking
button.
Click on a specific row in the list to see more detailed information such as the
method and line number of the code that allocated the object.
80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

Tracking Memory Allocation of Objects

PAGE 24

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

MAT (Memory Analyzer Tool)

PAGE 25

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

MAT (Memory Analyzer Tool)






The Eclipse Memory Analyzer Tool is a fast and feature-rich Java heap
analyzer that helps you find memory leaks and reduce memory
consumption.
Use the Memory Analyzer Tool to analyze productive heap dumps with
hundreds of millions of objects, quickly calculate the retained sizes of
objects, see who is preventing the Garbage Collector from collecting
objects, run a report to automatically extract leak suspects.
The Dalvik virtual machine can produce a complete dump of the contents
of the virtual heap. This is very useful for debugging memory usage and
looking for memory leaks.

PAGE 26

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

Install MAT


We can get the MAT from below URL:
http://www.eclipse.org/mat/
Get the correct version and install it from eclipse.

PAGE 27

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

Load Dump File


In eclipse, select ‘Memory Analysis’ tool, select the dump file by click the
menu ‘File > Open Heap Dump’, select the ‘Leak Suspects Report’ in the
‘Wizard’ dialog as below and click ‘Finish’, after a delay, the Leak
Suspects report will appear.

PAGE 28

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

The Leak Suspects Report





The report will generate a graph indicating things it thinks may be memory
leaks.
Leak Suspects include leak suspects and a system overview.
Not everything it thinks may be a leak actually is.
What you really need to suspect is things that have multiple instances
allocated or things which are using huge amounts of memory.

PAGE 29

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

The Leak Suspects Report

PAGE 30

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

The Leak Suspects Report






Clicked on the Details link. This causes three more reports to appear:
‘Shortest Paths To the Accumulation Point’, ‘Accumulated Objects’,
‘Accumulated Objects by Class’.
Shallow size of an object is the amount of memory allocated to store the
object itself, not taking into account the referenced objects. Shallow size
of a regular (non-array) object depends on the number and types of its
fields. Shallow size of an array depends on the array length and the type
of its elements (objects, primitive types). Shallow size of a set of objects
represents the sum of shallow sizes of all objects in the set.
Retained size of an object is its shallow size plus the shallow sizes of the
objects that are accessible, directly or indirectly, only from this object. In
other words, the retained size represents the amount of memory that will
be freed by the garbage collector when this object is collected.

PAGE 31

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

The Leak Suspects Report

PAGE 32

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

Histogram View



Analyze the results using the Histogram view.
Histogram lists number of instances per class.




PAGE 33

Identifies types of objects allocated.
Doesn't know whether they will eventually be freed.
We must compare two HPROF snapshots to identify which objects are
responsible for a leak.

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

Histogram View

PAGE 34

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

Histogram View


The ‘byte[ ]’ costs most of the heap, so right click on it and select ‘List
Objects > with incoming references’, from this, we can find which object
the data belong to.

PAGE 35

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

Dominator Tree


Dominator Tree will list the biggest objects and what they keep alive.

PAGE 36

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

Dominator Tree



From this list we can find potential leaked object, so many instances of
‘ComposeMessageActivity’ for this case, it’s abnormal.
Right click on it and select:





PAGE 37

List Objects > with incoming references: Shows objects that have an incoming
reference to the selected object. If there is a class that has many unwanted
instances it is good practice to find incoming references that are keeping it from
being GC.
Path To GC Roots > exclude weak/soft references: Shows the reference path
from the object to GC roots excluding weak/soft references
Merge Shortest Paths to GC Roots – Finds the common paths from garbage
collection roots to an object or a set of objects.

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

Dominator Tree


Right click on it and select:



PAGE 38

Show Retained Set - Calculates the retained set of an arbitrary set of objects.
Java Basics > Class Loader Explorer: Show the defined classes and the
number of live instances. If one and the same component is loaded multiple
times, the number of live instances can indicate which class loaders is more
alive and which one should be garbage collected

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

What to Do?


Perhaps it’s because the ‘mBackgroundQueryHandler’ hasn’t be released
before this activity is finished which cause this activity can’t be released.

PAGE 39

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

What to Do?


Use the Regex filter to find ‘ComposeMessageActivity’ objects inside the
Histogram view. There are 23 instances of ‘ComposeMessageActivity’.

PAGE 40

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

What to Do?




What we can do now is just check the related code to see if there are any
bugs.
Refer to [R5] for Android Memory Leaks and the solutions.
To avoid context-related memory leaks, remember the followings:





PAGE 41

Do not keep long-lived references to a context-activity (a reference to an activity
should have the same life cycle as the activity itself)
Try using the context-application instead of a context-activity
Avoid non-static inner classes in an activity if you don't control their life cycle,
use a static inner class and make a weak reference to the activity inside.
A garbage collector is not an insurance against memory leaks.

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

Detecting a Memory Leak

PAGE 42

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

Check the logcat Output Message



Your application crashes with an ‘Out of memory’ error after running for a
long time.
You can see frequent GC_ lines in logcat before the crash.

PAGE 43

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

Check the logcat Output Message


Out of memory message from the logcat output:

I/dalvikvm-heap( 3088): Clamp target GC heap from 103.616MB to 96.000MB
D/dalvikvm( 3088): GC_CONCURRENT freed 165K, 1% free 97769K/98148K,
paused 7ms+80ms, total 483ms
D/dalvikvm( 3088): WAIT_FOR_CONCURRENT_GC blocked 147ms
I/dalvikvm-heap( 3088): Forcing collection of SoftReferences for 376296-byte
allocation
I/dalvikvm-heap( 3088): Clamp target GC heap from 103.600MB to 96.000MB
D/dalvikvm( 3088): GC_BEFORE_OOM freed 16K, 1% free 97753K/98148K,
paused 392ms, total 392ms
E/dalvikvm-heap( 3088): Out of memory on a 376296-byte allocation

PAGE 44

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

Check the logcat Output Message
D/dalvikvm( 3088): GC_CONCURRENT freed 165K, 1% free
97769K/98148K, paused 7ms+80ms, total 483ms
The first part of message indicates the type of GC (reason of GC). There are
four different types:
GC_CONCURRENT

Invoked when the heap gets too large to prevent
overflow.

GC_FOR_MALLOC

Invoked when GC_CONCURENT was not run on
time and the application had to allocate more
memory.

GC_EXTERNAL_ALLOC

Used before Honeycomb for freeing external
allocated memory. In Honeycomb and higher there is
no external allocation.

GC_EXPLICIT

Invoked when System.gc is called.

PAGE 45

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

Check the logcat Output Message
D/dalvikvm( 3088): GC_CONCURRENT freed 165K, 1% free
97769K/98148K, paused 7ms+80ms, total 483ms
 “freed 165K” – indicates how much memory is freed.
 “1% free 97769K/98148K” – indicates the percentage of free memory left,
the size of live objects and the total heap size.
 “paused 7ms+80ms” – indicates how much time it takes the GC to finish
collection.
With this information, it is possible to tell after a few collections if the GC
successfully frees the memory. If the allocated memory does not go down
after some period of time (and keeps growing), it is clear that there is a
memory leak.

PAGE 46

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

Check the logcat Output Message
E/dalvikvm-heap( 3088): Out of memory on a 376296-byte allocation
When the available resources are exhausted, an OutOfMemoryError
exception is thrown. It may indicate that there is a memory leak. This
method is not the best way to know if there is a leak as the exception may
occur when the developer tries to allocate a large amount of memory (ex.
bitmap) and the total heap size will exceed the platform limit. It surely
indicates that the developer should rethink his memory management
method.

PAGE 47

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

Comparing Heap Dumps with MAT


When debugging memory leaks, sometimes it's useful to compare the
heap state at two different points in time. To do this, you'll need to:







PAGE 48

Create two separate HPROF files (don't forget to convert them using hprofconv).
Open the first HPROF file (using File > Open Heap Dump).
Open the Histogram view.
In the Navigation History view (use Window > Navigation History if it's not
visible), right click on histogram and select Add to Compare Basket.
Open the second HPROF file and repeat steps 2 and 3.
Switch to the Compare Basket view, and click Compare the Results (the red "!"
icon in the top right corner of the view).

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

Comparing Heap Dumps with MAT



Compare the number of instances and sizes of each type of object
between the two snapshots.
An unexplained increase in the number of objects may indicate a leak!

PAGE 49

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

Useful Information

PAGE 50

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

ServiceConnection Leak


Usually ServiceConnection leak is caused by client try to bind to service
but the service still not ready. For example, the service hasn’t been started
or the service can’t be started successfully.

06-13 10:23:15.672 W/ActivityManager( 654): Unable to start service Intent { act=com.zte.zgesture.IGestureService }: not found
06-13 10:23:15.762 E/ActivityThread( 1009): Activity com.android.phone.InCallScreen has leaked ServiceConnection android.view.ViewRootGestureDispatcher$1@41e2e730
that was originally bound here
06-13 10:23:15.762 E/ActivityThread( 1009): android.app.ServiceConnectionLeaked: Activity com.android.phone.InCallScreen has leaked ServiceConnection
android.view.ViewRootGestureDispatcher$1@41e2e730 that was originally bound here
06-13 10:23:15.762 E/ActivityThread( 1009):
at android.app.LoadedApk$ServiceDispatcher.(LoadedApk.java:969)
06-13 10:23:15.762 E/ActivityThread( 1009):
at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:863
)06-13 10:23:15.762 E/ActivityThread( 1009):
at android.app.ContextImpl.bindService(ContextImpl.java:1263)
06-13 10:23:15.762 E/ActivityThread( 1009):
at android.app.ContextImpl.bindService(ContextImpl.java:1255)
06-13 10:23:15.762 E/ActivityThread( 1009):
at android.content.ContextWrapper.bindService(ContextWrapper.java:394)
06-13 10:23:15.762 E/ActivityThread( 1009):
at android.view.ViewRootGestureDispatcher.(ViewRootGestureDispatcher.java:32)
06-13 10:23:15.762 E/ActivityThread( 1009):
at android.view.ViewRootImpl.(ViewRootImpl.java:415)
06-13 10:23:15.762 E/ActivityThread( 1009):
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:300)
06-13 10:23:15.762 E/ActivityThread( 1009):
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:232)
06-13 10:23:15.762 E/ActivityThread( 1009):
at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
06-13 10:23:15.762 E/ActivityThread( 1009):
at android.view.Window$LocalWindowManager.addView(Window.java:547)
06-13 10:23:15.762 E/ActivityThread( 1009):
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2641)
06-13 10:23:15.762 E/ActivityThread( 1009):
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2092)
06-13 10:23:15.762 E/ActivityThread( 1009):
at android.app.ActivityThread.access$600(ActivityThread.java:133)
06-13 10:23:15.762 E/ActivityThread( 1009):
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1198)
06-13 10:23:15.762 E/ActivityThread( 1009):
at android.os.Handler.dispatchMessage(Handler.java:99)
06-13 10:23:15.762 E/ActivityThread( 1009):
at android.os.Looper.loop(Looper.java:137)
06-13 10:23:15.762 E/ActivityThread( 1009):
at android.app.ActivityThread.main(ActivityThread.java:4777)
06-13 10:23:15.762 E/ActivityThread( 1009):
at java.lang.reflect.Method.invokeNative(Native Method)
06-13 10:23:15.762 E/ActivityThread( 1009):
at java.lang.reflect.Method.invoke(Method.java:511)
06-13 10:23:15.762 E/ActivityThread( 1009):
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
06-13 10:23:15.762 E/ActivityThread( 1009):
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
06-13 10:23:15.762 E/ActivityThread( 1009):
at dalvik.system.NativeStart.main(Native Method)
06-13 10:23:15.762 W/ActivityManager( 654): Unbind failed: could not find connection for android.os.BinderProxy@42127e18

PAGE 51

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

StrictMode



Enable ‘StrictMode’ also can find some object leak.
Please refer to [R10] for more information about ‘StrictMode’

PAGE 52

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

References

Ref.

Document

Qualcomm Technologies
Q1

Application Note: Software Glossary for Customers

CL93-V3077-1

Resources
R1

http://memoryanalyzer.blogspot.com/

Memory Analyzer Blog

R2

http://developer.android.com/tools/debugging/ddms.html

Using DDMS

R3

http://www.eclipse.org/mat/

Memory Analyzer Tool (MAT)

R4

http://milk.com/kodebase/dalvik-docs-mirror/docs/heap-profiling.html

Dalvik Heap Profiling

R5

http://blog.evendanan.net/2013/02/Android-Memory-Leaks-OR-DifferentWays-to-Leak

Android Memory Leak

R6

http://www.youtube.com/watch?v=_CruQY55HOk

Google I/O 2011: Memory
management for Android Apps

R7

http://www.yourkit.com/docs/90/help/sizes.jsp

Shallow and retained sizes

R8

http://kohlerm.blogspot.com/2009/07/eclipse-memory-analyzer-10useful.html

Eclipse Memory Analyzer, 10
useful tips/articles

R9

http://developer.samsung.com/android/technical-docs/Memory-ProfilerIdentifying-Potential-Problems

Memory Profiler - Identifying
Potential Problems

R10

http://developer.android.com/reference/android/os/StrictMode.html

Strict Mode

PAGE 53

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

References

Ref.

Document

Resources
R11

PAGE 54

http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.mat.ui.help%
2Fconcepts%2Fheapdump.html

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

Memory Analyzer Online Help

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION

Questions?
https://support.cdmatech.com

PAGE 55

80-NJ221-1 A

Jul 2013

Confidential and Proprietary – Qualcomm Technologies, Inc.

|

MAY CONTAIN U.S. AND INTERNATIONAL EXPORT CONTROLLED INFORMATION



Source Exif Data:
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
PDF Version                     : 1.5
Linearized                      : No
Encryption                      : Standard V2.3 (128-bit)
User Access                     : Print, Modify, Copy, Annotate, Fill forms, Print high-res
Content Type Id                 : 0x010100132EB7D4DD2165408F63C8AB2E07F49A
Modify Date                     : 2017:07:18 19:59:12-07:00
Create Date                     : 2013:07:30 14:50:52+08:00
Company                         : Qualcomm Incorporated
Author                          : 
Page Mode                       : UseOutlines
Page Layout                     : SinglePage
Format                          : application/pdf
Title                           : Android Memory Leak Analysis Guide
Creator                         : 
Producer                        : Adobe PDF Library 10.0; modified using iText® 5.4.0 ©2000-2012 1T3XT BVBA (AGPL-version)
Creator Tool                    : Acrobat PDFMaker 10.1 for PowerPoint
Tagged PDF                      : Yes
Page Count                      : 55
EXIF Metadata provided by EXIF.tools

Navigation menu