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.
- SparseBooleanArray.equals () no funciona como se esperaba
- Diferentes fling (swipe) de velocidad en diferentes dispositivos Android con la misma densidad
- Nuevo SDK de Google Analytics 4
- ListView Actualización de una sola fila
- Actualización de información de contacto de Android con intención?
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?
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
- Sistema de huellas dactilares en Java
- Ocultación de la tarjeta de teclado de forma fiable
- Pantalla de bienvenida de Android
- ValueAnimator sólo se repite una vez
- ¿Cómo obtener la dirección IP del host en android?
- Org.json.JSONException: Cadena no terminada en el carácter 1834
- Android instala apk sin pedir permiso de usuario
- Android, subir una foto para alojar en imgur programatically
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 decorar selectivamente los elementos de RecyclerView
- ¿Mostrar métricas menos la barra de estado?