Memory Management for Android Apps
Patrick Dubroy (dubroy.com · @dubroy)
May 11, 2011
3
192MB RAM
4
1GB RAM
5
G1
320x480
Xoom
1280x800
6
7
Work expands
to fill the time available.
Software
memory
Overview
• Changes in Gingerbread and Honeycomb
– heap size
– GC
– bitmaps
• Understanding heap usage
– logs
– memory leak...
Expectations
• Android
• Dalvik heap
• Garbage collection
• OutOfMemoryError
9
Heap Size
• Heap size limits
– G1: 16MB
– Droid: 24MB
– Nexus One: 32MB
– Xoom: 48MB
• ActivityManager.getMemoryClass()
10
Large Heaps
• Honeycomb adds “largeHeap” option in AndroidManifest.xml:
– Degrades performance! Use only if you understand...
Garbage Collection
12
GC Roots
Garbage Collection
13
GC Roots
Garbage Collection
14
GC Roots
Garbage Collection
15
GC Roots
Garbage Collection
• Bigger heaps = longer pauses?
• Pre-Gingerbread GC:
– Stop-the-world
– Full heap collection
– Pause t...
Bitmaps
Old way (pre-Honeycomb):
–freed via recycle() or finalizer
–hard to debug
–full, stop-the-world GCs
17
Managed
Nati...
Bitmaps
Old way (pre-Honeycomb):
–freed via recycle() or finalizer
–hard to debug
–full, stop-the-world GCs
New way:
–freed...
Overview
• Changes in Gingerbread and Honeycomb
– heap size
– GC
– bitmaps
• Understanding heap usage
– logs
– memory leak...
Overview
• Changes in Gingerbread and Honeycomb
– heap size
– GC
– bitmaps
• Understanding heap usage
– logs
– memory leak...
D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/
9991K, external 4703K/5261K, paused 2ms+2ms
Interpreting Log...
Interpreting Log Messages
D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/
9991K, external 4703K/5261K, pause...
Interpreting Log Messages
D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/
9991K, external 4703K/5261K, pause...
Interpreting Log Messages
D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/
9991K, external 4703K/5261K, pause...
Interpreting Log Messages
D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/
9991K, external 4703K/5261K, pause...
Interpreting Log Messages
D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/
9991K, external 4703K/5261K, pause...
Heap Dumps
• Binary dump of all objects
• Create with:
– DDMS
– android.os.Debug.dumpHprofData()
• Convert to standard HPR...
Memory Leaks
• GC does not prevent leaks!
• Leak: ref to an unused object preventing GC
• References to Activity (Context)...
Memory Leaks
29
Activity
ViewGroup
Views
Eclipse Memory Analyzer (MAT)
• Download from http://eclipse.org/mat/
• “Shallow heap” and “retained heap”
30
100
100
100 ...
Eclipse Memory Analyzer (MAT)
• Download from http://eclipse.org/mat/
• “Shallow heap” and “retained heap”
31
100
100
100 ...
Eclipse Memory Analyzer (MAT)
• Download from http://eclipse.org/mat/
• “Shallow heap” and “retained heap”
32
100
100 100
...
Eclipse Memory Analyzer (MAT)
• Download from http://eclipse.org/mat/
• “Shallow heap” and “retained heap”
33
100
100
100 ...
Dominator Tree
• Dominator: closest object on every path to node
34
A
B
C E
D
A
B C D
E
Demo: Debugging a memory leak with MAT
public class MainActivity extends Activity implements ActionBar.TabListener {
static Leaky leak = null;
class Leaky {
void...
public class MainActivity extends Activity implements ActionBar.TabListener {
static Leaky leak = null;
class Leaky {
void...
public class MainActivity extends Activity implements ActionBar.TabListener {
static Leaky leak = null;
class Leaky {
void...
public class MainActivity extends Activity implements ActionBar.TabListener {
static Leaky leak = null;
class Leaky {
void...
40
MainActivity
Leaky
MainActivity
class
Demo: Debugging a memory leak with MAT
Memory Leaks
• References to Activity, Context, View, Drawable, ...
• Non-static inner classes (e.g. Runnable)
• Caches
42
Links
• Articles on Android Developers Blog
– Memory Analysis for Android Applications
– Avoiding Memory Leaks by Romain G...
Memory management for_android_apps
Upcoming SlideShare
Loading in...5
×

Memory management for_android_apps

1,952

Published on

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,952
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
100
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Memory management for_android_apps

  1. 1. Memory Management for Android Apps Patrick Dubroy (dubroy.com · @dubroy) May 11, 2011
  2. 2. 3 192MB RAM
  3. 3. 4 1GB RAM
  4. 4. 5 G1 320x480 Xoom 1280x800
  5. 5. 6
  6. 6. 7 Work expands to fill the time available. Software memory
  7. 7. Overview • Changes in Gingerbread and Honeycomb – heap size – GC – bitmaps • Understanding heap usage – logs – memory leaks – Eclipse Memory Analyzer (MAT) 8
  8. 8. Expectations • Android • Dalvik heap • Garbage collection • OutOfMemoryError 9
  9. 9. Heap Size • Heap size limits – G1: 16MB – Droid: 24MB – Nexus One: 32MB – Xoom: 48MB • ActivityManager.getMemoryClass() 10
  10. 10. Large Heaps • Honeycomb adds “largeHeap” option in AndroidManifest.xml: – Degrades performance! Use only if you understand why you need it. <application android:name="com.example.foobar" android:largeHeap="true" ... </application> ActivityManager.getLargeMemoryClass() 11
  11. 11. Garbage Collection 12 GC Roots
  12. 12. Garbage Collection 13 GC Roots
  13. 13. Garbage Collection 14 GC Roots
  14. 14. Garbage Collection 15 GC Roots
  15. 15. Garbage Collection • Bigger heaps = longer pauses? • Pre-Gingerbread GC: – Stop-the-world – Full heap collection – Pause times often > 100ms • Gingerbread and beyond: – Concurrent (mostly) – Partial collections – Pause times usually < 5ms 16
  16. 16. Bitmaps Old way (pre-Honeycomb): –freed via recycle() or finalizer –hard to debug –full, stop-the-world GCs 17 Managed Native
  17. 17. Bitmaps Old way (pre-Honeycomb): –freed via recycle() or finalizer –hard to debug –full, stop-the-world GCs New way: –freed synchronously by GC –easier to debug –concurrent & partial GCs 18 Managed Native
  18. 18. Overview • Changes in Gingerbread and Honeycomb – heap size – GC – bitmaps • Understanding heap usage – logs – memory leaks – Eclipse Memory Analyzer (MAT) 19
  19. 19. Overview • Changes in Gingerbread and Honeycomb – heap size – GC – bitmaps • Understanding heap usage – logs – memory leaks – Eclipse Memory Analyzer (MAT) 20
  20. 20. D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/ 9991K, external 4703K/5261K, paused 2ms+2ms Interpreting Log Messages 21
  21. 21. Interpreting Log Messages D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/ 9991K, external 4703K/5261K, paused 2ms+2ms • Reason for GC – GC_CONCURRENT – GC_FOR_MALLOC – GC_EXTERNAL_ALLOC – GC_HPROF_DUMP_HEAP – GC_EXPLICIT 22
  22. 22. Interpreting Log Messages D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/ 9991K, external 4703K/5261K, paused 2ms+2ms • Reason for GC • Amount freed 23
  23. 23. Interpreting Log Messages D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/ 9991K, external 4703K/5261K, paused 2ms+2ms • Reason for GC • Amount freed • Heap statistics 24
  24. 24. Interpreting Log Messages D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/ 9991K, external 4703K/5261K, paused 2ms+2ms • Reason for GC • Amount freed • Heap statistics • External memory statistics 25
  25. 25. Interpreting Log Messages D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/ 9991K, external 4703K/5261K, paused 2ms+2ms • Reason for GC • Amount freed • Heap statistics • External memory statistics • Pause time 26
  26. 26. Heap Dumps • Binary dump of all objects • Create with: – DDMS – android.os.Debug.dumpHprofData() • Convert to standard HPROF format: hprof-conv orig.hprof converted.hprof • Analyze with MAT, jhat, etc. 27
  27. 27. Memory Leaks • GC does not prevent leaks! • Leak: ref to an unused object preventing GC • References to Activity (Context) – View, Drawable, ... 28
  28. 28. Memory Leaks 29 Activity ViewGroup Views
  29. 29. Eclipse Memory Analyzer (MAT) • Download from http://eclipse.org/mat/ • “Shallow heap” and “retained heap” 30 100 100 100 100
  30. 30. Eclipse Memory Analyzer (MAT) • Download from http://eclipse.org/mat/ • “Shallow heap” and “retained heap” 31 100 100 100 100 R = 100
  31. 31. Eclipse Memory Analyzer (MAT) • Download from http://eclipse.org/mat/ • “Shallow heap” and “retained heap” 32 100 100 100 100 R = 100
  32. 32. Eclipse Memory Analyzer (MAT) • Download from http://eclipse.org/mat/ • “Shallow heap” and “retained heap” 33 100 100 100 100 R = 400
  33. 33. Dominator Tree • Dominator: closest object on every path to node 34 A B C E D A B C D E
  34. 34. Demo: Debugging a memory leak with MAT
  35. 35. public class MainActivity extends Activity implements ActionBar.TabListener { static Leaky leak = null; class Leaky { void doSomething() { System.out.println("Wheee!!!"); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (leak == null) { leak = new Leaky(); } ... 36
  36. 36. public class MainActivity extends Activity implements ActionBar.TabListener { static Leaky leak = null; class Leaky { void doSomething() { System.out.println("Wheee!!!"); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (leak == null) { leak = new Leaky(); } ... 37
  37. 37. public class MainActivity extends Activity implements ActionBar.TabListener { static Leaky leak = null; class Leaky { void doSomething() { System.out.println("Wheee!!!"); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (leak == null) { leak = new Leaky(); } ... 38
  38. 38. public class MainActivity extends Activity implements ActionBar.TabListener { static Leaky leak = null; class Leaky { void doSomething() { System.out.println("Wheee!!!"); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (leak == null) { leak = new Leaky(); } ... 39
  39. 39. 40 MainActivity Leaky MainActivity class
  40. 40. Demo: Debugging a memory leak with MAT
  41. 41. Memory Leaks • References to Activity, Context, View, Drawable, ... • Non-static inner classes (e.g. Runnable) • Caches 42
  42. 42. Links • Articles on Android Developers Blog – Memory Analysis for Android Applications – Avoiding Memory Leaks by Romain Guy • Eclipse Memory Analyzer: http://www.eclipse.org/mat/ • Markus Kohlerʼs Java Performance Blog: http://kohlerm.blogspot.com/ • Feedback on this talk: http://speakermeter.com/talks/memory-management-android 43
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×