![Page 1: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/1.jpg)
“Detección de Memory Leaks utilizando Eclipse Memory Analyser”
Algeciras, jueves 26 de septiembre de 2013
![Page 2: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/2.jpg)
¿Quien soy?
@Gatreyu
Rafael David Piernagorda
iCo-Founder & Product Manager en
Socio en niciativas3D
![Page 3: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/3.jpg)
¿Qué es un Memory Leak?
Memory Leak [Fuga de Memoria] es un error software, que hace que no se libere memoria previamente reservada.
Muy común en C/C++ .
Java implementa Garbage Collector para solucionarlo.
![Page 4: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/4.jpg)
¿Qué es un Memory Leak?
Aún así se producen Memory Leaks con el Garbage Collector.
Pero… ¿Cómo funciona el Garbage Collector? Lo vemos más adelante.
Actualmente la memoria de los dispositivos aumenta. ¿Por qué preocuparse?
![Page 5: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/5.jpg)
Memoria en DispositivosMemoria en los dispositivos va aumentando (Estudio para Smartphones HTC)
0
500
1000
1500
2000
2500
Tamaño de la memoria a lo largo de los años (MB)
![Page 6: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/6.jpg)
Memoria en Dispositivos
Entonces ¿Cuál es el problema?Tamaño de pixeles en pantalla aumenta también
Tamaño de la memoria a lo largo de los años (MB)
0
1
2
3
4
5
6Pulgadas de dispositivos
0
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
Megapíxeles por pantalla
![Page 7: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/7.jpg)
Memoria en Dispositivos¿Y?
Supongamos el siguiente caso hipotético:HTC One(2 GB, 1,44 Mpíxeles de pantalla, 1080x1920)
Cliente desea una galería con cuadros que al hacer doble click se muestre en pantalla completa a máxima resolución. Fotografías de 1080x1920 con 24 bits de profundidad.
Hay 1500 cuadros para visualizar.
![Page 8: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/8.jpg)
Memoria en Dispositivos
Consumo de memoria (solo por la lectura de la imagen): 4,32 Mbytes.
¿Y qué? Tenemos 2Gbytes de memoria Ram.
Si queda como fuga de memoria (no libera las imágenes), y visualiza solamente 20 cuadros, habrá consumido 86,4 MB.
De esta forma solamente podrá visualizar 460 Cuadros (sin apagar el móvil y sin utilizar otra aplicación).
![Page 9: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/9.jpg)
Memoria en DispositivosSi utiliza visualiza 461 cuadros:
Nuestra querida excepción:
OutOfMemoryException.
![Page 10: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/10.jpg)
Memoria en DispositivosTodo esto en el caso hipotético ya que:
• No hemos tenido en cuenta otras aplicaciones, ni la memoria ya consumida.• Se ha considerado que nunca se apagará el dispositivo.• No hemos tenido en cuenta el Heap (en los dispositivos con Honeycomb (Android 4.0) habría saltado antes el OutOfMemoryException)• Hemos utilizado un dispositivo con mucha memoria.
![Page 11: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/11.jpg)
¿Qué es Garbage Collector?
Proceso de gestión de memoria, utilizado para liberar aquellas zonas de memoria reservadas que no están siendo utilizadas.
Java, lenguaje O/O, hay referencias entre clases.
![Page 12: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/12.jpg)
¿Qué es Garbage Collector?
Referencia entre clases:
Public class TestingClass{
private OtherClass _otherClass;}
Aquí TestingClass tiene una referencia a OtherClass, por lo que si TestingClass no se libera de memoria, quedarán ambas referencias: TestingClass y OtherClass.
![Page 13: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/13.jpg)
¿Cómo funciona el Garbage Collector?Lo mejor verlo con un ejemplo.
Las referencias entre objetos crean un grafo, que el Garbage Collector recorre para detectar aquellos nodos que ya no están en memoria (han sido liberados). El Garbage collector siempre comenzará por el nodo GCRoot.
La raiz del GC hace referencia a A.La clase A hace referencia a B, y a la clase C. La clase C hace referencia a la clase DY la clase D hace referencia a E y F
![Page 14: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/14.jpg)
¿Cómo funciona el Garbage Collector?Imaginemos nodo F deja de estar referenciado por D.
Cuando el Garbage Collector recorra este árbol, el nodo F no es alcanzado desde el nodo GCRoot por lo tanto será liberado.
La clase A hace referencia a B, y a la clase CLa clase C hace referencia a la clase DY la clase D hace referencia a E y F
![Page 15: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/15.jpg)
¿Cómo funciona el Garbage Collector?Supongamos ahora que el objeto con la clase A crea un objeto con la clase G, y que le pasa el objeto de clase C a G, y después se intenta liberar A y forzamos al GC a hacer Collect()
¿Qué creéis que pasará?El objeto A no podrá ser liberada, porque tiene una referencia a C, por lo que mientras dure la vida de G, el Objeto A seguirá activo.
Acabamos de tener un Memory Leak.
![Page 16: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/16.jpg)
HEAP
El grafo con las relaciones de los objetos están almacenados en un HEAP.
Todas las aplicaciones tienen asociado un Heap.
Garbage Collector gestiona el uso de este Heap, siendo este de un tamaño limitado según dispositivo.
![Page 17: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/17.jpg)
HEAP
Tamaños de Heap:
HTC Dream (Google Phone) 16 MB Droid 24 MBNexus One 32 MBXoom 48 MB
![Page 18: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/18.jpg)
HEAP
Conceptos asociados al HEAP
Dominator Tree => Es aquel árbol cuyos caminos de sus nodos conducen directamente hacia el nodo principal.
![Page 19: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/19.jpg)
HEAP
Conceptos asociados al HEAP
Dominator Tree. Este árbol (comienzo con el nodo A) no es dominator tree debido a que el nodo C puede ser alcanzado tanto por el nodo A como el nodo G.
![Page 20: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/20.jpg)
HEAP
Conceptos asociados al HEAP
Dominator Tree. Visión en MAT
![Page 21: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/21.jpg)
HEAP
Conceptos asociados al HEAP
Shallow Heap: Nos indica la memoria consumida por un único objeto.Retained Heap: Nos indica la memoria consumida por todo el árbol desde ese nodo.
![Page 22: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/22.jpg)
HEAP
Conceptos asociados al HEAP
![Page 23: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/23.jpg)
HEAP
¿Qué ocurre cuando el Heap se llena?
Out Of Memory Exception
¿Por qué no agrandar el heap?
Garbage Collector recorre el heap para liberar la memoria, si es grande, el proceso es lento, y las aplicaciones se vuelven ineficientes.
![Page 24: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/24.jpg)
HEAPProblema con las imágenes:
Antes de HoneyCombHeap solo tiene la referencia, la imagen se carga en memoria Nativa.Es difícil de depurar
![Page 25: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/25.jpg)
HEAPProblema con las imágenes:
Con HoneyComb (Android 4.0)Memoria Externa se aloja en el Heap.Luego, las imagen se cargan en el Heap.Fácil de depurar.
![Page 26: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/26.jpg)
HEAPSupongamos, nuestra aplicación anterior.
•Nexus One. • Heap: 32 MB• Mpixeles: 0,38
• Fotografías de 24 bits, ocupan: 1,12 MB
Si no se libera la memoria, solo podríamos cargar (en el caso hipotético) 28 cuadros.
![Page 27: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/27.jpg)
¿Qué hacemos si detectamos un Memory Leak?
1. LlorarNo soluciona nada, pero si te gusta desahogarte así, adelante.
![Page 28: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/28.jpg)
¿Qué hacemos si detectamos un Memory Leak?
2. Usar la técnica del AvestruzNo soluciona nada.
Pero por desgracia es una técnica muy popular entre muchos desarrolladores y Product Manager.
Que halla mucha memoria no significaque no pueda pasar.
Si quieres que ocurra presenta el producto a un Cliente o Inversor, y el fallo ocurrirá con su mayor consecuencia.
![Page 29: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/29.jpg)
¿Qué hacemos si detectamos un Memory Leak?
3. Hacer un análisis del códigoInvestigar la fuga de memoria que existe dentro del código.
Utilizar herramientas necesarias para ver las referencias entre los objetos y encontrar las fugas de memoria.
Herramienta: Eclipse Memory Analyser.
![Page 30: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/30.jpg)
¿Que señales nos indicarían que hay un ML?
1. Utilizando el Log de Eclipse• Los mensajes del GC tiene esta forma
D/dalvikvm( 29003): GC_CONCURRENT freed 378K, 41% free 3373K/6151K, external 0K/0K, paused 12ms+11ms
• Diferentes tipos de mensaje:• GC_Concurrent: Se activa cuando la pila crece, y se quiere
recuperar memoria en tiempo de ejecución.• GC_Explicit: Cuando la aplicación fuerza llamar al System.gc()• GC_External_malloc: Se usa para memoria externa.• GC_For_malloc: Se activa cuando el heap se llena y la
aplicación necesita más memoria.• GC_HPROF_Dum_Heap: Cuando se crea el HPROF.
![Page 31: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/31.jpg)
¿Que señales nos indicarían que hay un ML?
1. Utilizando el Log de Eclipse• Análisis del Log
D/dalvikvm( 29003): GC_CONCURRENT freed 378K, 41% free 3373K/6151K, external 0K/0K, paused 12ms+11ms
• “freed 378k” nos indica la memoria liberada.• “41% free 3373k/6151k” nos indica el % de memoria libre.• “external 0K/0K” nos indica la cantidad de memoria externa
liberada.
![Page 32: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/32.jpg)
¿Que señales nos indicarían que hay un ML?
1. Utilizando el Log de Eclipse• Para detectarlo, en primer lugar creamos un filtro en LogCat
![Page 33: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/33.jpg)
¿Que señales nos indicarían que hay un ML?
1. Utilizando el Log de Eclipse• Dejar ejecutar la aplicación, y una vez que tengamos los suficientes
mensaje, echar un vistazo.
![Page 34: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/34.jpg)
¿Que señales nos indicarían que hay un ML?
2. Utilizando el DDMS (Dalvik Debug Monitor Server)• Es más visual y fácil de entender
![Page 35: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/35.jpg)
¿Que señales nos indicarían que hay un ML?
2. Utilizando el DDMS (Dalvik Debug Monitor Server)• La memoria usada aumenta, al igual que los objetos.
![Page 36: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/36.jpg)
¿Que señales nos indicarían que hay un ML?
3. Utilizando el MAT Report• Podemos ver el overview del Heap Dump
![Page 37: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/37.jpg)
¿Que señales nos indicarían que hay un ML?
3. Utilizando el MAT Report• Utilizamos el Top Consumer
![Page 38: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/38.jpg)
¿Que señales nos indicarían que hay un ML?
3. Utilizando el MAT Report• Utilizamos el Top Consumer
![Page 39: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/39.jpg)
Detección de Memory Leak en Vivo
MAT se descarga desde: http://eclipse.org/mat/O usando Update Manager de Eclipse:
http://www.eclipse.org/mat/downloads.php
Primera demostración
![Page 40: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/40.jpg)
Detección de Memory Leak en Vivo
¿Qué está pasando?
![Page 41: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/41.jpg)
Detección de Memory Leak en Vivo
¿Qué está pasando?
Cuando se da la vuelta al dispositivo, se crea un nuevoMainActivity, y se libera el anterior. Pero este nunca esliberado.
La clase MainActivity hace referencia a ConsumingClassque a su vez hace referencia a MainActivity, y el objetoConsumingClass es insertado en un Stack y nunca se libera.
![Page 42: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/42.jpg)
Detección de Memory Leak en Vivo
¿Qué está pasando?
![Page 43: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/43.jpg)
Detección de Memory Leak en Vivo
Pero, ¿y si necesitamos pasar el contexto a la claseConsumingClass, como lo hacemos?
Si queremos pasar el contexto, para acceder por ejemplo alos recursos, no tenemos que pasar toda la actividad,solamente utilizar getApplicationContext().
![Page 44: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/44.jpg)
Detección de Memory Leak en Vivo
¿Qué está pasando?
![Page 45: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/45.jpg)
Detección de Memory Leak en Vivo
Segundo ejemplo, clásico ejemplo de Memory Leak.
Creamos una inner class (LeakClass) dentro de unaactividad (MainClass) pero no la denotamos como estática,y creamos un variable estática que sea de la claseLeakClass.
¿Qué ocurre?
![Page 46: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/46.jpg)
Detección de Memory Leak en Vivo
Se ha creado un Leak de un MainActivity, debido a que lainner class (LeakClass) está encapsulada a la MainActivityque es la Outer.
![Page 47: Presentación Detección de Memory Leaks en Android](https://reader033.vdocuments.co/reader033/viewer/2022051520/58a4fec51a28abce778b5d77/html5/thumbnails/47.jpg)
Gracias