Problemas de asignación de memoria con la aplicación Android

Tengo una aplicación de Android que realiza análisis de imágenes, que se administra con un IntentService – el proceso toma un par de segundos cada vez y funciona con precisión y rapidez.

Pero cuando el proceso se repite en la aplicación alrededor de 50 veces (como se ilustra) comienza a llegar muy lento hasta el punto en el que la aplicación y el dispositivo se vuelve inutilizable. Cuando se reinicia el dispositivo y la aplicación se abre de nuevo, se ejecuta como de costumbre.

Inspección con Android Studio Puedo ver que cada vez que ejecuto el análisis que la asignación de memoria para la aplicación sube y sube cada vez alrededor de 1 MB . Por lo tanto, se está quedando sin memoria cuando se bloquea.

He utilizado esta bandera en terminar el análisis y va al resultado para intentar fijar las actividades del fondo;

 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 

Que ha tenido un efecto mínimo, y entiendo que el IntentService se controla cerrando. Así que no estoy seguro de qué más puedo hacer para tratar de reducir la asignación de memoria o por lo menos aclarar la asignación y dejar de añadir a ella?

Flujo de trabajo de análisis de imágenes

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 de IntentService

Parece que no está manejando los recursos (variables, archivos de imagen, etc) correctamente, y su creación de pérdidas de memoria en su aplicación.

Usted puede encontrar aquí en este blog Escrito por Johan sobre el manejo de las fugas de memoria en su aplicación o ver esta Pregunta SO.

Evitar fugas de memoria en Android

Si las pérdidas de memoria se generan en la biblioteca c ++, entonces puede encontrar fácilmente el recurso que está filtrando la memoria en el modo de depuración.

Después de la actividad de resultado, debe llamar al recolector de basura como lo sugiere Grisgram y cerrar los recursos no utilizados.

Sería bueno si pudiera proporcionar el rastro de la pila en la pregunta.

Intente usar leakCanary https://github.com/square/leakcanary para averiguar qué está causando la filtración y use una https://developer.android.com/reference/java/lang/ref/WeakReference.html weakReference para permitirlo Para ser recogida de basura cuando sea necesario. También puede ser que el dispositivo que está utilizando no tiene suficiente memoria para almacenar 50 imágenes de alta resolución en la memoria al mismo tiempo. Puede intentar bajar la resolución de las imágenes si las mantiene en la memoria y asegúrese de que está reciclando bitmaps https://developer.android.com/topic/performance/graphics/manage-memory.html

También consideraría usar 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

Quería añadir algo a la respuesta de Ali786.

Servicios de intención no son realmente la mejor opción para algo que va a repetirse. La próxima vez que llame al servicio entra en una cola. Los Servicios de Intención funcionan como HandlerThreads. Tienen sus propios MessageQueues y después de iniciar el servicio con Intent, esperará el anterior.

Los servicios normales que se ejecutan en el subproceso de interfaz de usuario se ejecutan en paralelo.

No estoy seguro si usted está haciendo algo después de enviar la información del análisis a su actividad, pero si lo hace, el servicio intención no va a morir y el siguiente 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) tal vez podamos darle una respuesta más precisa. ¡Espero que esto ayude!

Una cosa puede ser que suceda así, si su servicio de intención de trabajo después del trabajo completo puede ser su no destruir el servicio

Comprobar los ajustes que ejecutan la lista de servicios para ejecutar el servicio de la aplicación

  • Android: NullPointerException a pesar de @NonNull
  • Deslizar la carga en SimpleTarget <Bitmap> no respetando el ancho y la altura especificados
  • ¿Por qué son las anotaciones bajo Android un problema de rendimiento (lento)?
  • Java.lang.Void vs void vs Null
  • Fragmentos, AsyncTask y Oyentes
  • Cómo hacer HorizontalScrollView RIGHT a LEFT Scroll android
  • Usando {} después de punto y coma
  • ¿Cómo obtener mejoras de rendimiento mediante el procesamiento para Android?
  • Calendario - Obtener el último día del mes anterior
  • OSMDroid PathOverlay
  • Error retrofit.RetrofitError: java.io.EOFException para Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.