2011-01-28 1 views
0

J'ai une application assez complexe -Comment traquer les fuites de mémoire - Trouver des références de vie

L'activité de l'interface utilisateur lance un service et met en place 2 voies callbacks AIDL si les deux peuvent communiquer.

Le service s'exécute pour toujours (sauf si le bouton 'off' est désactivé dans l'activité de l'interface utilisateur).

Le problème est que lorsque l'utilisateur quitte l'activité, la mémoire d'activité n'est pas libérée. -La quantité de mémoire utilisée par mon application est la même, même si l'activité de l'interface utilisateur a été fermée. -Le segment de mémoire affiche toujours mapTiles et d'autres conneries de l'interface utilisateur même si l'activité de l'interface utilisateur a été fermée.

Donc, je suppose que le Service détient des références à l'activité. Je connais les nombreux articles mettant en garde contre la fuite du contexte d'activité. Le service référence uniquement l'activité via une référence faible stockée dans la portée de l'application. (une classe qui étend l'application)

Y a-t-il un moyen de trouver ce qu'est spécifiquement le référencement de l'activité? L'arbre du dominateur montre des mappages de mapTiles et de ListView qui mangent toute ma mémoire ... mais je ne trouve pas la référence à l'activité qui maintient ces choses en vie.

En outre, est-il un moyen de vider une chose de vidage de tas de HPROF si OutOfMemoryException se produit?

Répondre

0

Le problème est lorsque l'utilisateur quitte l'activité , la mémoire d'activité n'est pas publié.

Il n'y a pas de "exit Activity" dans Android. Appeler finish() ou appuyer sur l'activité ne supprime pas les objets de la mémoire utilisés par l'activité. Android prend intrinsèquement soin de cela lui-même à un moment aléatoire dans le futur.

Si vous voulez que vos objets à libéré de la mémoire au moment où l'activité se termine, vous devez les libérer manuellement vous-même.

Modifier: La classe qui peut être utilisée pour trouver l'utilisation de la mémoire est le ActivityManager.

+0

Lorsque je fais Menu -> Applications -> Services en cours d'exécution. Il montre que com.myapp a 15 Mo. J'aurais pensé sortir de l'activité (flèche de retour) et ensuite jouer un peu au téléphone, l'activité serait ramassée et le nombre diminuerait. Ça ne le fait jamais. – paulpooch

+0

Cet écran est spécifique aux services. Votre activité démarre un service et ce service correspond à ce que vous voyez en utilisant ces 15 Mo de mémoire. Ce service ne s'arrête pas lorsque vous quittez l'activité. Il est géré par l'OS pour être arrêté si nécessaire. Par exemple, j'ai actuellement des services qui fonctionnent depuis plus de 48 heures ... la dernière fois que j'ai redémarré mon téléphone. À l'intérieur de votre code de service, vous pouvez choisir d'arrêter/démarrer ce service comme vous le souhaitez. – user432209

+0

Ok - bien, il est bon de savoir que l'écran est spécifique à la classe de service. Y a-t-il un gestionnaire de tâches? Comment puis-je savoir quelle quantité de RAM utilise l'activité? – paulpooch

0

Si ce n'est pas vous qui détenez une référence ("référence l'activité via une référence faible stockée dans la portée de l'application", l'annulez-vous, je me demande pourquoi vous référencez l'activité dans le service) , avez-vous essayé d'exécuter un GC? Tant qu'il reste suffisamment de mémoire, aucun gc n'aura lieu pour éloigner les déchets.

+0

dans l'activité onDestroy, j'appelle WeakReference.clear() pour m'assurer que la référence d'activité n'existe plus. Imaginez que c'est une application de messagerie électronique ... le Service interroge un serveur et met à jour la base de données locale avec de nouveaux courriels. Alors il dit hey "si la référence d'activité d'UI n'est pas nulle, dites-leur d'afficher les nouveaux messages". – paulpooch

Questions connexes