¿Los procesos de VM de Dalvik liberan la RAM del sistema?

La documentación para desarrolladores de Android, como parte del Proyecto Svelte (lema: "¿Alguna vez probaste ajustar Bugdroid en vaqueros flacos?)", Tiene una página sobre Cómo administrar la memoria de tu aplicación . Contiene:

Cuando el usuario navega a una aplicación diferente y su interfaz de usuario ya no es visible, debe liberar cualquier recurso que utilice su interfaz de usuario. Liberar recursos de la interfaz de usuario en este momento puede aumentar significativamente la capacidad del sistema para los procesos almacenados en caché, lo cual tiene un impacto directo en la calidad de la experiencia del usuario.

y:

TRIM_MEMORY_RUNNING_LOW : Su aplicación se está ejecutando y no se considera eliminable, pero el dispositivo se está ejecutando mucho más bajo en la memoria, por lo que debería liberar los recursos no utilizados para mejorar el rendimiento del sistema (lo que afecta directamente al rendimiento de la aplicación).

y similares.

Sin embargo, esto sólo tendría sentido si "liberar recursos" afectaría de alguna manera a la RAM del sistema.

Tenía la impresión de que el VM de Dalvik se comportaba como lo hace la VM de Java (o tal vez "lo hizo", si la cambiaran cuando no estaba buscando). AFAIK, la VM de Java asigna RAM del sistema para aumentar el tamaño del montón, pero nunca lo libera. Una vez asignado, permanece como parte del espacio de montón durante el tiempo que se ejecuta el proceso.

Si la VM de Dalvik se comporta de la misma manera, entonces no veo cómo aumentar la cantidad de espacio de montón no asignado en nuestro proceso tendría algún impacto en el rendimiento general del sistema. Ahora, liberar un montón de espacio para nuestro proceso es una buena cosa, y tal vez hacerlo disminuiría la probabilidad de que necesitamos más RAM del sistema en el futuro … pero eso no es lo que implica la documentación. La documentación establece que "Liberar recursos de interfaz de usuario en este momento puede aumentar significativamente la capacidad del sistema para los procesos almacenados en caché"; No dice "Liberar recursos de la interfaz de usuario en este momento no tiene impacto inmediato pero ayudará a reducir la huella del RAM del sistema de su aplicación en el futuro".

Ahora, si las instrucciones nos dijeran que liberamos la memoria asignada a través del NDK, tendría sentido, ya que eso ocurre fuera del montón de Dalvik y afectaría la RAM del sistema. Pero la documentación no hace esa distinción.

¿La VM Dalvik realmente devuelve la RAM asignada al sistema, aparte de terminar el proceso? ¿Si es así cuando? Y, en menor medida, ¿cómo se hace esto, considerando que el recolector de basura no compacta y no copia?

¡Gracias!

One Solution collect form web for “¿Los procesos de VM de Dalvik liberan la RAM del sistema?”

Sí. La idea básica es que, si hay una página de 4K sin nada, la página será devuelta al sistema.

La función que hace esto en la máquina virtual se llama trimHeaps() , en dalvik / vm / alloc / HeapSource.cpp . Puedes verlo usando mspace_trim() , que usa las llamadas del sistema operativo para unmap los fragmentos que ya no son necesarios (vea los comentarios de malloc_trim () alrededor de la línea 1203 en malloc.c ). A continuación, recorre el montón con mspace_inspect_all() , que llama a releasePagesInRange() para cada región. La devolución de llamada prueba para ver si se pasó una región sin asignaciones en ella y si es así, trunca los límites a la alineación 4K. Si el resultado no está vacío, sabemos que la región abarca una o más páginas físicas de 4K, las cuales pueden ser devueltas al sistema con madvise(MADV_DONTNEED) .

trimHeaps() se llama desde algunos lugares, sobre todo gcDaemonThread() , que iniciará el recorte cinco segundos después de un GC concurrente. El temporizador se restablece si el GC concurrente ocurre antes de que transcurran cinco segundos, la idea es que si estamos GCing entonces la VM está ocupado asignando y este tipo de recorte de tiempo de inactividad será contraproducente.

Debido a que el GC de Dalvik no compacta, esto no es tan efectivo como podría ser. La fragmentación tiende a acumularse con el tiempo, por lo que la situación puede empeorar durante el tiempo que dura un proceso. El marco de aplicación puede "reciclar" servicios de larga duración para aliviar esto.

  • ¿Por qué mi aplicación Android asigna cantidades sustancialmente diferentes de memoria en diferentes versiones del sistema operativo?
  • Monitor de memoria en Android Studio informa del uso de RAM diferente del dispositivo
  • Android: obtener memoria asignada
  • Diferencia entre malloc y dlmalloc
  • ¿Cómo puedo depurar el consumo de memoria RAM de mi aplicación Android en tiempo de ejecución?
  • ¿Llamando a finish () de una actividad liberará mi espacio de memoria?
  • ¿Cómo Android OS calcula el uso de memoria de una aplicación?
  • Java mmap falla en Android con "mmap failed: ENOMEM (Fuera de memoria)"
  • Convertir un entero en una cadena sin asignar memoria
  • Fuera de error de memoria que se ocupa de mapas de bits grandes y el ciclo de vida de actividad de Android
  • Reciclaje de bitmaps
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.