He visto muchas respuestas de Android que sugieren llamar al recolector de basura en algunas situaciones.
¿Es una buena práctica solicitar el recolector de basura en Android antes de realizar una operación que consume mucha memoria? Si no es así, ¿debería llamarlo solo si obtengo un OutOfMemory
error?
¿Hay otras cosas que deba usar antes de recurrir al recolector de basura?
fuente
En términos generales, en presencia de un recolector de basura, nunca es una buena práctica llamar manualmente al GC. Un GC se organiza en torno a algoritmos heurísticos que funcionan mejor cuando se dejan en sus propios dispositivos. Llamar al GC manualmente a menudo reduce el rendimiento.
Ocasionalmente , en algunas situaciones relativamente raras, uno puede encontrar que un GC en particular se equivoca y una llamada manual al GC puede mejorar las cosas, en términos de rendimiento. Esto se debe a que no es realmente posible implementar un GC "perfecto" que administre la memoria de manera óptima en todos los casos. Estas situaciones son difíciles de predecir y dependen de muchos detalles sutiles de implementación. La "buena práctica" es dejar que el GC funcione solo; una llamada manual al CG es la excepción, que solo debe contemplarse después de que se haya presenciado debidamente un problema de rendimiento real.
fuente
Bitmap.finalize()
métodos que liberan la memoria que no es de VM). Por lo tanto, en este caso, debe pasar por encima de la cabeza del GC y ejecutarBitmap.recycle()
oSystem.gc()
cuando corresponda. Pero solo pre-panal.La falta de memoria en la aplicación de Android es muy común si no manejamos correctamente el mapa de bits.La solución al problema sería
En el código anterior, acabo de intentar reciclar el mapa de bits, lo que le permitirá liberar el espacio de memoria utilizado, por lo que es posible que no se agote la memoria. Lo intenté y funcionó para mí.
Si aún enfrenta el problema, también puede agregar estas líneas
para más información echa un vistazo a este enlace
https://web.archive.org/web/20140514092802/http://voices.yahoo.com/android-virtual-machine-vm-out-memory-error-7342266.html?cat=59
NOTA: Debido a la momentánea "pausa" causado por la realización de GC, se no se recomienda hacer esto antes de cada asignación de mapa de bits.
El diseño óptimo es:
Libere todos los mapas de bits que ya no sean necesarios , mediante el
if / recycle / null
código que se muestra. (Crea un método para ayudarte con eso).System.gc();
Asigne los nuevos mapas de bits.
fuente
Si obtiene un OutOfMemoryError, generalmente es demasiado tarde para llamar al recolector de basura ...
Aquí hay una cita del desarrollador de Android:
Entonces, a mi entender, no hay una necesidad urgente de llamar al gc. Es mejor dedicar más esfuerzo a evitar la creación innecesaria de objetos (como la creación de objetos dentro de bucles)
fuente
Parece
System.gc()
que no funciona en Art Android 6.0.1 Nexus 5x, así que lo usoRuntime.getRuntime().gc();
en su lugar.fuente
System.gc()
es una función contenedora paraRuntime.getRuntime().gc()
. Ver android.googlesource.com/platform/libcore/+/…System.gc()
no me funciona, ¡peroRuntime.getRuntime().gc()
sí!Mi aplicación maneja muchas imágenes y murió con un OutOfMemoryError. Eso me ayudó. En el Manifest.xml Agregar
fuente
En términos generales, no debe llamar a GC explícitamente con System.gc (). Incluso está la conferencia IO ( http://www.youtube.com/watch?v=_CruQY55HOk ) donde explican qué significa el registro de pausas de GC y en la que también afirman que nunca deben llamar a System.gc () porque Dalvik sabe mejor que tú cuando hacerlo.
Por otro lado, como se mencionó en las respuestas anteriores, el proceso GC en Android (como todo lo demás) a veces tiene errores. Esto significa que los algoritmos de Dalvik GC no están a la par con las JVM de Hotspot o JRockit y pueden equivocarse en algunas ocasiones. Una de esas ocasiones es cuando se asignan objetos de mapa de bits. Este es complicado porque usa memoria Heap y Non Heap y porque una instancia suelta de un objeto de mapa de bits en un dispositivo con restricción de memoria es suficiente para darle una excepción OutOfMemory. Entonces, llamarlo después de que ya no necesite este mapa de bits, generalmente es sugerido por muchos desarrolladores e incluso algunas personas lo consideran una buena práctica.
Una mejor práctica es usar .recycle () en un mapa de bits, ya que es para lo que está hecho este método, ya que marca la memoria nativa del mapa de bits como seguro para eliminar. Tenga en cuenta que esto depende mucho de la versión, lo que significa que generalmente será necesario en versiones anteriores de Android (creo que Pre 3.0) pero no será necesario en versiones posteriores. Además, no hará mucho daño usarlo en versiones más nuevas de ether (simplemente no hagas esto en un bucle o algo así). El nuevo tiempo de ejecución de ART cambió mucho aquí porque introdujeron una "partición" de Heap especial para objetos grandes, pero creo que no dolerá mucho hacer esto con ART ether.
También una nota muy importante sobre System.gc (). Este método no es un comando al que Dalvik (o JVM) estén obligados a responder. Considérelo más como decirle a la máquina virtual "¿Podría hacer la recolección de basura si no es una molestia?".
fuente
La mejor manera de evitar OOM durante la creación de mapas de bits,
http://developer.android.com/training/displaying-bitmaps/index.html
fuente
Yo diría que no, porque los documentos del desarrollador sobre el estado de uso de RAM :
He resaltado la parte relevante en negrita.
Eche un vistazo a la serie de YouTube, Patrones de rendimiento de Android : le mostrará consejos sobre cómo administrar el uso de la memoria de su aplicación (como el uso de
ArrayMap
s ySparseArray
s de Android en lugar deHashMap
s).fuente
Nota rápida para desarrolladores de Xamarin .
Si desea llamar
System.gc()
a las aplicaciones de Xamarin.Android, debe llamarJava.Lang.JavaSystem.Gc()
fuente
No es necesario llamar al recolector de basura después de un
OutOfMemoryError
.Es Javadoc dice claramente:
Por lo tanto, el recolector de basura ya intentó liberar memoria antes de generar el error, pero no tuvo éxito.
fuente