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

  • Cómo bloquear los botones de Android / teléfono de código (bloqueo de pantalla)?
  • Serialización v / s
  • Para cada uno dentro de un para cada - Java
  • ¿Descriptor de archivos, ejemplo de filtración?
  • Bitmap.Config.HARDWARE vs Bitmap.Config.RGB_565
  • C ++ ifstream.getline () significativamente más lento que BufferedReader.readLine () de Java?
  • Persista HashMap en ORMLite
  • Obtener longitud desconocidaHttpInputStream al obtener InputStream de HttpURLConnection en android
  • Cómo probar unidades de manejo de texto bidireccional
  • Los puntos de interrupción del método pueden reducir drásticamente la depuración
  • La autenticación mutua de SSL FAIL en Android Client acepta el certificado de servidores pero el servidor no obtiene el certificado de cliente
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.