He usado / proc / meminfo y he analizado la respuesta de comando, sin embargo, el resultado muestra que:
MemTotal: 94348 kB MemFree: 5784 kB
medio. muestra que solo hay 5 MB de memoria libre. ¿Es posible con un móvil Android? Solo hay 5-6 aplicaciones instaladas en mi móvil y no se está ejecutando ninguna otra tarea. pero aún así este comando muestra que hay muy poca memoria libre.
¿Alguien puede aclarar esto? ¿O hay alguna otra forma de obtener el uso de la memoria en Android?
android
memory-management
Badal
fuente
fuente
Debug.getNativeHeapFreeSize()
.Respuestas:
PRECAUCIÓN: Esta respuesta mide el uso de memoria / disponible del DISPOSITIVO. Esto NO es lo que está disponible para su aplicación. Para medir lo que está haciendo su APLICACIÓN, y está PERMITIDO, use la respuesta del desarrollador de Android .
Documentos de Android: ActivityManager.MemoryInfo
comando parse / proc / meminfo. Puede encontrar el código de referencia aquí: Obtener uso de memoria en Android
use el siguiente código y obtenga la RAM actual:
Explicación del número 0x100000L
Es bastante obvio que el número se usa para convertir de bytes a mebibyte
PD: necesitamos calcular la memoria total solo una vez. así que llame al punto 1 solo una vez en su código y luego, puede llamar al código del punto 2 repetidamente.
fuente
Depende de su definición de la consulta de memoria que desee obtener.
Por lo general, le gustaría saber el estado de la memoria del montón, ya que si usa demasiada memoria, obtiene OOM y bloquea la aplicación.
Para ello, puede comprobar los siguientes valores:
Cuanto más se acerca la variable "usedMemInMB" a "maxHeapSizeInMB", cuanto más
availHeapSizeInMB
se acerca a cero, más se acerca a OOM. (Debido a la fragmentación de la memoria, es posible que obtenga OOM ANTES de que llegue a cero).Eso es también lo que muestra la herramienta DDMS de uso de memoria.
Alternativamente, existe el uso real de RAM, que es la cantidad que usa todo el sistema; consulte la respuesta aceptada para calcular eso.
Actualización: dado que Android O hace que su aplicación también use la RAM nativa (al menos para el almacenamiento de Bitmaps, que suele ser la razón principal del gran uso de memoria), y no solo el montón, las cosas han cambiado y obtiene menos OOM (porque el heap ya no contiene mapas de bits, verifique aquí ), pero aún debe estar atento al uso de la memoria si sospecha que tiene pérdidas de memoria. En Android O, si tiene pérdidas de memoria que deberían haber causado OOM en versiones anteriores, parece que simplemente fallará sin que pueda detectarlo. A continuación, le indicamos cómo verificar el uso de la memoria:
Pero creo que podría ser mejor usar el generador de perfiles del IDE, que muestra los datos en tiempo real, usando un gráfico.
Entonces, la buena noticia en Android O es que es mucho más difícil tener bloqueos debido a que OOM almacena demasiados mapas de bits grandes, pero la mala noticia es que no creo que sea posible detectar un caso así durante el tiempo de ejecución.
EDITAR: parece
Debug.getNativeHeapSize()
cambia con el tiempo, ya que le muestra la memoria máxima total para su aplicación. Entonces, esas funciones se usan solo para el generador de perfiles, para mostrar cuánto está usando su aplicación.Si desea obtener la RAM nativa total y disponible real, use esto:
fuente
A continuación, se muestra una forma de calcular el uso de memoria de la aplicación que se está ejecutando actualmente :
fuente
Runtime.freeMemory()
devuelve 0 yRuntime.totalMemory()
devuelve solo la memoria asignada actualmente.Otra forma (actualmente muestra 25 MB gratis en mi G1):
fuente
La filosofía de administración de memoria de Linux es "La memoria libre es memoria desperdiciada".
Supongo que las siguientes dos líneas mostrarán cuánta memoria hay en "Búferes" y cuánta está "en caché". Si bien existe una diferencia entre los dos (no pregunte cuál es esa diferencia :), ambos se suman aproximadamente a la cantidad de memoria utilizada para almacenar en caché los datos y metadatos de archivos.
Una guía mucho más útil para liberar memoria en un sistema Linux es el
free(1)
comando; en mi escritorio, informa información como esta:La línea +/- buffers / cache: es la línea mágica, informa que realmente tengo alrededor de 589 megas de memoria de proceso activamente requerida y alrededor de 5391 megas de memoria 'libre', en el sentido de que los 91 + 374 megabytes de búferes / memoria caché se pueden desechar si la memoria se puede utilizar de manera más rentable en otro lugar.
(Mi máquina ha estado funcionando durante aproximadamente tres horas, sin hacer casi nada más que stackoverflow, razón por la cual tengo tanta memoria libre).
Si Android no viene incluido
free(1)
, puedes hacer los cálculos tú mismo con el/proc/meminfo
archivo; Simplemente me gusta elfree(1)
formato de salida. :)fuente
cat /proc/meminfo
hacerlo. Es mucho más detallado, peroMemFree
.Buffers
, yCached
probablemente sean las líneas más importantes.Menciono pocos escritos.
referencia:
Este método getMemorySize () devuelve MemorySize que tiene un tamaño de memoria total y libre.
No creo este código perfectamente.
Este código se está probando en LG G3 cat.6 (v5.0.1)
Sé que Pattern.compile () tiene un costo elevado, por lo que puede mover su código al miembro de la clase.
fuente
Miré el árbol de fuentes de Android.
Dentro de com.android.server.am. ActivityManagerService.java (servicio interno expuesto por android.app. ActivityManager ).
Dentro de android.os. Process.java
Llama al método JNI desde android_util_Process.cpp
Conclusión
MemoryInfo.availMem = MemFree + Caché en / proc / meminfo.
Notas
La memoria total se agrega en el nivel de API 16.
fuente
También puede utilizar la herramienta DDMS, que forma parte del SDK de Android. también ayuda a obtener asignaciones de memoria del código Java y del código nativo C / C ++.
fuente
fuente
Es un código extraño. Devuelve MaxMemory - (totalMemory - freeMemory). Si freeMemory es igual a 0, entonces el código devolverá MaxMemory - totalMemory, por lo que puede ser mayor o igual a 0. ¿Por qué no se usa freeMemory?
fuente
Aquí hay otra forma de ver el uso de memoria de su aplicación:
Salida de muestra:
Para el uso general de la memoria:
https://developer.android.com/studio/command-line/dumpsys#meminfo
fuente