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.
- Uso de AccountAuthenticator personalizado con múltiples aplicaciones
- Tag <uses-permission> nombre de atributo tiene un carácter no válido ''
- ¿Dónde colocar setContentView () en onCreate ()?
- Actualizar tabla Sqlite si campo de cadena comienza con signo más (+)?
- ¿Cómo obtengo las Notificaciones Push de Parse.com trabajando en una aplicación para Android de Cordova / Phonegap?
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
- LRUCache reordenación de entrada al usar get
- Cómo mostrar 3 fragmentos dentro de PageViewer
- Manejo del componente de la daga en el cambio de orientación
- ProGuard para Android y GSON
- Cómo agregar la barra de herramientas en PreferenciaActividad
- Cómo cambiar una RealmList a RealmResult?
- Android: Programe el modo de selección de texto en un WebView en Jelly Bean
- Java android: agregando una nueva línea usando TextView
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?