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.

  • Précharger la page Web en Android (en utilisant WebView?)
  • Activation de l'événement lorsque le bouton est enfoncé dans Android
  • HTML5 ou Android
  • Définition d'attrs personnalisés
  • GCM FC / Sender id n'est pas défini sur le constructeur
  • Comment vérifier la disponibilité de l'espace sur le stockage externe?
  • 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

  • Obtenez le fichier Android .apk VersionName ou VersionCode SANS installer l'apk
  • Getting 'E / TokenRequestor: Vous avez une configuration OAuth2 incorrecte. Erreur détaillée: INVALID_AUDIENCE 'même après avoir fourni des identifiants de clients précis
  • Android: comment accéder par programme au numéro de série du périphérique affiché dans le gestionnaire AVD (API Version 8)
  • Désactivation de multi-touch sur mon application
  • Téléchargement de données textuelles de 12 mb depuis url et sauvegarde sur carte sd ... Le problème de mémoire de tas se produit. Toute solution?
  • Structure de ressource dans Apache Cordova (PhoneGap) et chargement des fichiers à partir du système de fichiers
  • 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.