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

J'ai une application Android qui effectue une analyse d'image, qui est gérée avec un service IntentService : le processus prend quelques secondes à chaque fois et fonctionne avec précision et rapidité.

Mais lorsque le processus est répété dans l'application environ 50 fois (comme illustré), il commence à être très lent jusqu'à ce que l'application et l'appareil deviennent inutilisables. Lorsque le périphérique est redémarré et que l'application s'ouvre à nouveau, elle s'exécute comme d'habitude.

  • Android - Problèmes liés à la journalisation de la latence de démarrage
  • Supprimez le rembourrage autour de l'icône de la barre d'action gauche sur Android 4.0+
  • Les meilleures pratiques pour utiliser le domaine avec une vue de recyclage?
  • Stockez l'image à Blobstore à partir du client Android et récupérez blobkey et téléchargez l'url pour la sauvegarder dans Datastore. - GAE
  • GCM s'arrête de fonctionner après un certain temps
  • Comment enregistrer la voix dans Android?
  • En vérifiant avec Android Studio, je peux voir que chaque fois que je lance l'analyse, l'allocation de mémoire pour l'application augmente à chaque fois d'environ 1 Mo. Donc, il manque clairement de mémoire quand il se bloque.

    J'ai utilisé ce drapeau pour terminer l'analyse et aller au résultat pour tenter de corriger les activités de fond;

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

    Qui a eu un effet minimal, et je comprends que IntentService gère lui-même l'arrêt. Je ne suis donc pas sûr de ce que je peux faire pour essayer de réduire l'allocation de la mémoire ou au moins effacer l'allocation et arrêter d'y ajouter?

    Analyse d'image Workflow

    Plus de détails:

    • L'application utilise l'implémentation de caméra en fonction de Google Camera2
    • L'analyse se fait avec une bibliothèque C ++ via IntentService

  • Existe-t-il un équivalent de setColorFilter () en XML?
  • Android: comment accédez-vous à une chaîne-chaîne de strings.xml dans une classe personnalisée?
  • Architecture d'application Android - quel est le modèle suggéré?
  • Comment changer la couleur d'arrière-plan du bouton de basculement sur Android
  • Vue d'ensemble du pied de page sur Android 2.3.3
  • Problème de mise en page Android - largeurs relatives en pourcentage utilisant le poids
  • 4 Solutions collect form web for “Problèmes d'allocation de mémoire avec l'application Android”

    Il semble que vous ne manipulez pas correctement les ressources (variables, fichiers image, etc.) et crée des fuites de mémoire dans votre application.

    Vous pouvez trouver ici dans ce blog Écrit par Johan sur le traitement des fuites de mémoire dans votre application ou voir cette Question SO.

    Évitez les fuites de mémoire sur Android

    Si les fuites de mémoire sont générées dans la bibliothèque c ++, vous pouvez facilement trouver la ressource qui perd la mémoire en mode Débogage.

    Après l'activité de résultat, vous devez appeler le collecteur d'ordures comme suggéré par Grisgram et fermer les ressources inutilisées.

    Il serait bon que vous puissiez fournir la trace de la pile dans la question.

    Essayez d'utiliser leakCanary https://github.com/square/leakcanary pour savoir ce qui cause la fuite et utilisez une référence faible https://developer.android.com/reference/java/lang/ref/WeakReference.html pour l'autoriser Des ordures collectées au besoin. Il se peut aussi que l'appareil que vous utilisez ne dispose pas de suffisamment de mémoire pour contenir 50 images haute résolution en même temps. Vous pouvez essayer d'abaisser la résolution des images si vous les gardez en mémoire et assurez-vous que vous recyclez les bitmaps https://developer.android.com/topic/performance/graphics/manage-memory.html

    Je considérerais également l'utilisation d'un threadPoolExecutor au lieu d'un service d'intention, ils sont beaucoup plus configurables https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html

    Je voulais ajouter quelque chose à la réponse d'Ali786.

    Les services d'intention ne sont pas vraiment le meilleur choix pour quelque chose qui se répétera. La prochaine fois que vous appelez le service, il passe dans une file d'attente. Les services d'intention fonctionnent comme HandlerThreads. Ils ont leurs propres MessageQueues et après avoir démarré le service avec Intent, il attendra le précédent.

    Les services normaux qui fonctionnent sur le thread UI sont en cours d'exécution en parallèle.

    Je ne sais pas si vous faites quelque chose après que vous envoyiez les informations de l'analyste à votre activité, mais si vous le faites, le service intentionnel ne mourra pas et le prochain devra attendre. Les services d'intention ne sont pas le meilleur choix pour communiquer avec votre fil UI, Asynctask pourrait être mieux dans votre cas. Si vous nous donnez plus d'informations (code), nous pouvons vous donner une réponse plus précise. J'espère que cela t'aides!

    Une chose peut être que cela se passe de la sorte, si votre service d'intention de travail après le travail complet peut être que vous ne détruisez pas le service

    Paramètres de vérification dans la liste des services en cours d'exécution de votre application

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.