java - quitar - Problemas de asignación de memoria con la aplicación de Android
problemas con gradle en android studio (4)
Intente usar leakCanary https://github.com/square/leakcanary para averiguar qué está causando la fuga y use una https://developer.android.com/reference/java/lang/ref/WeakReference.html weakReference para permitirlo Para ser recogido de basura cuando sea necesario. También puede ser que el dispositivo que está utilizando no tenga suficiente memoria para almacenar 50 imágenes de alta resolución en la memoria al mismo tiempo. Puede intentar reducir la resolución de las imágenes si las guarda en la memoria y asegúrese de que está reciclando mapas de bits https://developer.android.com/topic/performance/graphics/manage-memory.html
También consideraría utilizar un threadPoolExecutor en lugar de un servicio de intención, son mucho más configurables https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html
Tengo una aplicación para Android que realiza el análisis de imágenes, que se administra con un IntentService
. El proceso toma un par de segundos cada vez y funciona de manera precisa y rápida.
Pero cuando el proceso se repite en la aplicación alrededor de 50 veces (como se ilustra) comienza a ser muy lento hasta el punto en que la aplicación y el dispositivo se vuelven inutilizables. Cuando el dispositivo se reinicia y la aplicación se abre de nuevo, se ejecuta como de costumbre.
Al inspeccionar con Android Studio puedo ver que cada vez que ejecuto el análisis, la asignación de memoria para la aplicación aumenta y aumenta cada vez aproximadamente 1 MB . Así que claramente se está quedando sin memoria cuando se bloquea.
He usado esta bandera para finalizar el análisis e ir al resultado para intentar corregir las actividades de fondo;
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
Lo que ha tenido un efecto mínimo, y entiendo que el IntentService se apaga por sí mismo. Entonces, ¿no estoy seguro de qué más puedo hacer para tratar de reducir la asignación de memoria o al menos borrar la asignación y dejar de agregarla?
Más detalles:
- La aplicación está utilizando la implementación de la cámara basada en Google Camera2.
- El análisis se realiza con una biblioteca de C ++ a través del IntentService
Parece que no está manejando los recursos (variables, archivos de imagen, etc.) correctamente, y está generando pérdidas de memoria en su aplicación.
Puede encontrarlo aquí en este blog escrito por Johan sobre cómo manejar las fugas de memoria en su aplicación o ver esta pregunta.
Evita las pérdidas de memoria en Android
Si las pérdidas de memoria se generan en la biblioteca c ++, puede encontrar fácilmente el recurso que pierde la memoria en el modo de depuración.
Después de la actividad de resultados, debe llamar al recolector de basura como lo sugiere Grisgram y cerrar todos los recursos no utilizados.
Sería bueno si pudiera proporcionar el seguimiento de pila en la pregunta.
Quería agregar algo a la respuesta de Ali786.
Los servicios de intención no son realmente la mejor opción para algo que se va a repetir. La próxima vez que llame al servicio, se pondrá en cola. Los servicios de intención funcionan como HandlerThreads. Tienen sus propios MessageQueues y, una vez que inicie el servicio con Intención, esperará al anterior.
Los servicios normales que se ejecutan en el subproceso de la interfaz de usuario se ejecutan en paralelo.
No estoy seguro de si está haciendo algo después de enviar la información del análisis a su actividad, pero si lo hace, el servicio de atención no morirá y el próximo tendrá que esperar. Los servicios de intención no son la mejor opción para comunicarse con su hilo de interfaz de usuario, Asynctask podría ser mejor en su caso. Si nos da más información (código), quizás podamos darle una respuesta más precisa. ¡Espero que esto ayude!
Una cosa puede ser que suceda así: si su servicio con la intención de trabajar después de completar el trabajo puede ser que no destruya el servicio
Verifique la configuración de la lista de servicios en ejecución para ejecutar el servicio de su aplicación