Android y el uso de la memoria

HoTiTo

Bien, en el thread del SE X10 Mini os transmití mi desasosiego por la poca ram que veía libre a veces, que siempre andaba matando procesos con el Advanced Task Killer, etc.

Respondiéndome a mí mismo me dispuse a buscar información y por casualidad encontré algo revelador y que ayuda a entender (y echar por tierra algunos mitos) el sistema de manejo de la memoria en Android.

El post interesante es el que os pasteo a continuación:

"Por lo que dices y como lo dices, creo que estás pensando que todos los programas que ves en un gestor de tareas o desde la parte de "administrar servicios" son programas residentes. No es así. Un programa de Android puede quedarse residente en memoria (como el Gtalk, que tiene un hermoso botón de cerrar y sólo se arranca al inicio si lo configuras así, o el reproductor de música si está reproduciendo algo), pero los que lo hacen son realmente muy pocos, y los que lo hacen no guardan la interfaz entera sino sólo una pequeña parte del programa sin nada gráfico y que suele usar muy poca memoria.

La mayoría de los programas por el contrario lo que hacen es "registrarse" con el sistema para responder a ciertos eventos. Todos los programas que se registran para responder a eventos salen en el administrador de servicios, pero no tienen porque estar en memoria como podrás comprobar si haces un top o un ps desde la línea de comandos; lo estarán sólo si hay memoria de sobra, como el resto de programas. La mayoría de los programas que ves en el gestor de servicios son de este tipo. Algunos responden a notificaciones push (Gmail, PingChat, Whatsapp, Chrome2Phone, Calendar, etc), otros responden a alarmas que les manda el sistema en tiempos determinados (un depertador), otros responden a alarmas a intervalos periódicos (Twitter, Facebook y demás). Esos programas no tienen que estar en memoria, sólo cuando llega el evento que sea Android los carga, les pasa el evento, lo procesan, y se cierran.

El hecho de que veas tantos programas en el arranque es porque en Android un programa si quiere recibir eventos tiene que registrarse al inicio, de modo que el mogollón de programas ejecutándose en realidad lo único que hacen es "apuntarse" para recibir los eventos que sean y luego cerrarse. Esto es así porque cuando un programa le dice al sistema que, por ejemplo, le despierte cada media hora para comprobar el twitter, esa configuración no se pasa de un arranque a otro, de modo que hay que volver a ponerla al inicio. Y esto lo hacen todos los programas que tengas instalados que tengan la posibilidad de responder a un evento incluso aunque tengas desactivadas las notificaciones en el programa; en este caso se despiertan, ven que no tienen que registrar nada, y se cierran, pero si usas un programa para ver los procesos que se ejecutan al inicio te saldrá.

Sobre el "algoritmo del mono", es bien sencillo y es parecido al que usa por ejemplo Linux para las cachés del disco (en Linux casi nunca hay RAM vacía al poco de arrancar, todo lo que sobra lo usan las cachés del disco), se puede resumir en "mete todo lo que puedas en memoria, y si nos quedamos sin memoria, cárgate lo que menos se use". Todo parte de la premisa de que la memoria RAM vacía, no sirve para absolutamente nada. De modo que si estás en un programa y abres otro, si hay memoria libre no hay ninguna necesidad de cerrar el primer programa. Lo que se hace es mandarle una señal de "pausa" que detiene la ejecución del programa para que no consuma nada de CPU (esta señal el programa la puede ignorar, pero es raro que lo hagan salvo que por algún motivo necesiten seguir ejecutándose como un cronómetro o un reproductor musical). Si más adelante sigues abriendo programas y de repente la memoria esta llena, Android selecciona una "victima" y la cepilla. El algoritmo que elige para cepillarse un programa es algo más complicado, pero si un programa no tiene notificaciones, no está en primer plano y hace mucho que no se usa, tiene todas las papeletas. Entonces le manda una señal "stop" para que el programa guarde su estado y lo cierra.

No se gana absolutamente nada, en Android ni en ningún otro sistema, por tener la memoria vacía, al contrario, al dejar los programas en memoria los cambios entre ellos son mucho más rápidos.

Dicho lo cual, si sigues angustiado por tener la memoria llena de programas o porque muchos programas se inician en el arranque (aunque como te digo luego es como si no estuvieran), el programa que buscas es "Startup Auditor". Con ese verás que programas se registran en el inicio y podrás desactivarlos, pero luego no te sorprendas si dejas de recibir notificaciones o no suena el despertador :) Incluso si quitas del arranque un programa para el cual no tienes notificaciones y más adelante configuras en el programa que te notifique, no funcionará si no te acuerdas de reactivar que se ejecute al arrancar."

La discusión trata sobre la efectividad o no de usar un task killer. La podéis encontrar entera en el siguiente link:

http://barrapunto.com/comments.pl?sid=84795&op=&threshold=-1&commentsort=0&mode=thread&pid=1234494#1234500

Y de paso, también la fuente de donde parte la discusión:

http://www.elandroidelibre.com/2010/08/como-ahorrar-bateria-en-tu-android.html

RPV
Shaka

Solo lei el rpv porque me tengo que ir ya a casa (toy currando).

Que no hace falta mtar las aplicaciones antes abiertas? pues la verdad es que cada vez que noto el scrol de menu relentizado, me fijo en la memoria y estoy alrededor de 100 o menos, meto el killer y saco de nuevo casi 200, y ya va fino fino el menu al hacer scrol.

Josetxe

después de leer este post he quitado el mini widget de taskiller y he dejado de darle compulsivamente. He abierto varios programas y al final 2 o 3 forzar-cierre para entrar a taskiller de lo jodidamente mal q iba!!

yo creo que lo mejor es poner en ignore el sense, el correo, gmail, el tiempo, el netcount, el reloj y poco mas... asi te llegan todas las actualizaciones, y lo que no necesitas lo cierras, y lo realmente necesario queda ahi.

Ademas, la memoria sin usar no vale para nada, pero ¿no consume más batería (pregunto, porque se calienta el telefono en el home q su puta madre) y sobre todo, ralentiza mucho al telefono. La 2ª aplicacion q instale fue el taskiller asiq no sabia la diferencia, pero ha sido no usarlo 10mins y pense que mi desire era un symbian antiguo xD en plan scrolls jodidetes, abriendo apps un poco lento, etc

HoTiTo

Que curioso. Yo quité el task killer y he notado el SE X10 pro perfecto, todo bien. Aunque creo que me chupa mas batería, cosa que no entiendo según el artículo. Tengo que seguir investigando, pero vamos, en cuanto rendimiento no he notado nada que fuera a peor...

Más opiniones?

Spybreak

Las aplicaciones "minimizadas" en android no usan CPU, solo RAM.

Las transiciones graficas no usan RAM, solo CPU/GPU.

La RAM sin usar es RAM desperdiciada.

Sacad vuestras propias conclusiones.

Josetxe

#5 ya las he sacado en la práctica, y no coinciden con la teoría.

Spybreak

#6 Entonces lo que tienes es una aplicacion que al "minimizarse" sigue activa. Encuentra esa aplicacion y encontrarás tu problema.

HoTiTo

Yo es que sigo sin tener problemas dos días después de haber dejado de usar el Advanced Task Killer. Me va todo igual de fluido y sin ralentizarse para nada.

Usuarios habituales

  • HoTiTo
  • Spybreak
  • Josetxe
  • Shaka