Spanish SOLUCIONADO: Saber el consumo de RAM en tiempo real

manuel_g

Member
Licensed User
Hola buena tarde.

Quisiera conocer el consumo de RAM de mi app, puesto que el app hace muchas y diferentes tareas durante una misma sesión de usuario, y he notado que pasados ciertos minutos la app empieza a ponerse lenta.

Adicionalmente, qué cosas debo tener presente para ahorrar RAM? Qué procesos debo matar, debo eliminar variables, cerrar cursores, el GPS, el ScaleImageView, variables globales??? Es más, cómo puedo conocer los procesos que quedan ejecutándose en segundo plano??

Mil gracias
 

GeoT

Active Member
Licensed User
Hola Manuel.

Para ir controlando el consumo de memoria puedes utilizar el código del post Out of memory crash - how to check memory available.
Creo recordar que el valor a medir es el maxMemory.

Una de las cosas que más memoria consume son muchas imágenes abiertas de cierto tamaño.

Si, para ahorrar memoria debes controlarlo tú. Todo depende de lo que estés utilizando y pararlo o liberarlo cuando ya no lo utilices o ya no se visualice.

Saludos.
 
Last edited:

manuel_g

Member
Licensed User
Gracias por responder.

Ya que dices que yo debo controlarlo, tengo una duda.
El aplicativo tiene muchos Módulos y para cada uno hay un Layout diferente. Al cambiar de un módulo a otro siempre lo hago con Activity.Finish y seguidamente StartActivity(módulo_siguiente). Es esa la mejor manera?

Ahora, la duda es si al usar Activity.Finish él elimina las cosas que en ese Módulo se usaron: cursores, variables, listas, mapas, imágenes, jobs, etc... O quedan por ahí ocupando memoria...

Gracias por tu tiempo
 

GeoT

Active Member
Licensed User
De nada Manuel.

El método Activity.Finish detiene y destruye la actividad actual, pero ahora no sé seguro si elimina todo eso de la memoria.
Lo siento.
Quizás puedas irlo comprobando con el código del enlace que te dije. O ir mostrando con un log los valores de esas variables, si está inicializado ese cursor....

Lo que sé es que no se suele finalizar una activity si vas a volver a ella después, pues entraría otra vez en su Activity_Create...

Android tiene un ciclo de vida de la aplicación.

Y para llamar al recolector debería funcionar el código:

B4X:
Dim Reflector1 As Reflector
Reflector1.RunStaticMethod("java.lang.System", "gc", Null, Null)


Saludos.
 

GeoT

Active Member
Licensed User
Acabo de averiguar que

Si llamas al método Activity.Finish se destruye la actividad y todos sus recursos se ponen en cola para la recolección de basura.

Por lo tanto, toda la memoria utilizada por esa actividad se liberará durante el próximo ciclo del Garbage Collector (recolector).

O bien puedes intentar el código anterior para limpiar la memoria llamando al recolector (gc).

Y también puedes añadir la etiqueta de aplicación en el manifiesto

B4X:
SetApplicationAttribute(android:largeHeap,"true")

para solicitar un tamaño de pila más grande.
 
Last edited:

manuel_g

Member
Licensed User
Hola!!

Probé midiendo antes y después del Activity.finish y luego con el Colector y aunque no es mucha la diferencia sí hay más memoria libre. Mil gracias!

Y por si alguien tiene la misma duda así se mide la memoria libre:


B4X:
Dim r As Reflector
        r.Target = r.RunStaticMethod("java.lang.Runtime", "getRuntime", Null, Null)
        Log("Free Memory = " & (r.RunMethod("freeMemory")/(1024*1024)) & " MB")
        Log("Max Memory = " & (r.RunMethod("maxMemory")/(1024*1024)) & " MB")
        Log("Total Memory = " & (r.RunMethod("totalMemory")/(1024*1024)) & " MB")


Finalmente...
Puedes darle una ojeada a esta duda? Gracias de nuevo!
 

GeoT

Active Member
Licensed User
Hola Manuel.
De nada.

Me alegro por tí.
Bien por compartirlo.

Ahora le echo un ojo a tu otra duda.

Saludos.
 
Top