27 votes

Problèmes d'allocation de mémoire avec l'application Android

J'ai une application android qui effectue l'analyse d'image, qui est géré avec un IntentService - le processus ne prend que quelques secondes à chaque fois et fonctionne rapidement et avec précision.

Mais lorsque le processus est répété dans l'application autour de 50 fois (comme illustré) il commence à faire très lente jusqu'à ce que le point dans lequel l'application et de l'appareil devient inutilisable. Lorsque l'appareil est redémarré et de l'application s'ouvre à nouveau, il fonctionne comme d'habitude.

Inspecter avec Android Studio, je peux voir que chaque fois que je lance l'analyse que l'allocation de mémoire pour l'application passe-haut à chaque fois d'environ 1 MO. C'est donc clairement à court de mémoire quand il se bloque.

J'ai utilisé cet indicateur sur la finition de l'analyse et d'aller à la résultat à essayer de corriger activités d'arrière-plan;

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

qui a eu un effet minime, et je comprends la IntentService gère lui-même de l'arrêter. Donc, pas sûr que ce que je peux faire pour essayer de réduire l'allocation de mémoire ou au moins de dégager de répartition et d'arrêter d'en ajouter?

Image Analysis Workflow

Plus de détails:

  • L'application utilise la caméra de mise en œuvre basé sur Google la caméra 2
  • L'analyse est effectuée avec une bibliothèque C++ grâce à la IntentService

10voto

Ali786 Points 2472

Il semble que vous ne sont pas de la manipulation de la ressources (variables, des fichiers d'image,etc) correctement, et sa création des fuites de mémoire dans votre application.

vous pouvez trouver ici dans ce blog Écrit par Johan sur la manipulation de l'fuites de mémoire dans votre application ou de voir cette SI Question.

Éviter les fuites de mémoire sur Android

Si les fuites de mémoire sont produites dans la bibliothèque c++ alors vous pouvez facilement trouver la ressource qui est une fuite de la mémoire en mode de débogage.

Après le résultat de l'activité, vous devez appeler le garbage collector comme suggéré par Grisgram et fermez toutes les ressources inutilisées.

Il serait bien si vous pouviez fournir la trace de la pile dans la question.

2voto

SBC Points 92

Essayez d'utiliser leakCanary https://github.com/square/leakcanary pour savoir quelle est l'origine de la fuite et de l'utilisation d'un weakReference https://developer.android.com/reference/java/lang/ref/WeakReference.html pour lui permettre d'être nettoyée si nécessaire. Il se peut aussi que le périphérique que vous utilisez ne dispose pas d'assez de mémoire pour contenir 50 haute résolution des images dans la mémoire en même temps. Vous pourriez essayez de réduire la résolution des images si vous les garder en mémoire et assurez-vous de recyclage des bitmaps https://developer.android.com/topic/performance/graphics/manage-memory.html

Je voudrais également envisager d'utiliser un threadPoolExecutor à la place de l'intention du service, ils sont beaucoup plus configurable https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html

1voto

T.Dimitrov Points 137

Je voulais ajouter quelque chose à Ali786 de réponse.

L'intention des Services ne sont pas vraiment le meilleur choix pour quelque chose qui va se répéter. La prochaine fois que vous appelez le service, il va dans une file d'attente. L'intention des Services de travail comme HandlerThreads. Ils ont leur propre MessageQueues et après le démarrage du service avec l'Intention qu'il va attendre que la précédente.

Normal des services qui s'exécutent sur le Thread d'INTERFACE utilisateur sont exécutés en parallèle.

Je ne suis pas sûr si vous faites quelque chose après l'envoi de l'information de l'analys à votre activité, mais si vous le faites, l'intention du service ne mourra pas et le suivant devra attendre. L'intention des services ne sont pas le meilleur choix pour communiquer avec votre Thread de l'INTERFACE utilisateur, Asynctask peut-être mieux dans votre cas. Si vous nous donner plus de renseignements (le code), nous pouvons peut-être vous donner une réponse plus précise. Espérons que cette aide!

0voto

Hemanth S Tobi Points 302

Une chose peut se produire comme ceci, si votre service d'intention de travail après la fin du travail peut être votre non-destruction du service

Vérifiez les paramètres de la liste de services pour exécuter le service de votre application

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X