2010-11-25 7 views
1

J'ai donc auto libéré/libéré chaque objet que j'alloue/init/copier ... et l'instrument d'allocations semble montrer des fuites minimes ... cependant ... l'utilisation de la mémoire de mon programme n'arrête pas d'augmenter. J'ai inclus une capture d'écran de mes allocations d'exécution (j'ai couru des allocations pour plus longtemps mais il reste relativement constant ... il ne se compare certainement pas à la quantité que gagne le programme quand il est en cours d'exécution. La mémoire augmente drastiquement dans les 5 premières minutes (2-3MB), et continue à avancer.Je ne comprends pas pourquoi les allocations resteraient constantes lors de l'exécution dans les instruments, mais mon programme continuerait à gagner de la mémoire alors qu'en réalité, exécutezAide w/gestion de la mémoire ... allocations montre pas de fuites, mais le programme fuit comme un fou

Depuis que je ne peux pas poster encore d'images ... voici le lien vers la capture d'écran.

allocations run

MISE À JOUR: Voici quelques captures d'écran de mon analyse de mémoire de mémoire ... Je n'alloue pas ces objets explicitement et je ne sais pas vraiment d'où ils viennent. Presque tous ont leur source avec quelque chose de similaire aux détails de la seconde capture d'écran sur la droite (beaucoup de HTTP et d'URLs dans l'arbre d'appels). Quelqu'un sait d'où viennent-ils? Je sais que j'ai lu à propos de certaines fuites NSURLConnection, mais j'ai essayé tous les effacement de cache que ceux suggèrent en vain. Merci pour toute l'aide jusqu'ici!

memory heap analysis 1

memory heap analysis 2

+0

Et si vous positionniez votre position de tête de série 1 comme point de départ et que vous récupériez votre point de vue hors-ligne un peu plus tard? Il semble assez stable après ce pic initial. –

+0

J'ai essayé cela et vous avez raison, la mémoire est relativement stable après cela. Il y a toujours des fuites plus petites mais similaires presque tous les tas. – ambientdiscourse

Répondre

2
+0

Merci, je vais vérifier cela. – ambientdiscourse

+0

Heapshots a été très utile, cependant, je ne sais pas d'où proviennent la plupart de ces allocations ... Je ne les fais pas explicitement ... je vais modifier ma question avec une mise à jour de capture d'écran pour voir si quelqu'un peut aider avec cette. Merci encore! – ambientdiscourse

+0

Merci encore ... heapshots a été déterminant pour résoudre ce problème. – ambientdiscourse

0

Si vous utilisez des objets autoreleased (comme [NSString stringWithFormat:]) dans une boucle de la piscine ne sera pas vidé jusqu'à ce que la boucle est sorti et le programme est autorisé à compléter la boucle d'événement principal, à quel point le pool d'autorelease est drainé et un nouveau est instancié. Si vous avez un code comme celui-ci, la solution est d'instancier un nouveau pool de libérations automatiques avant d'entrer dans votre boucle, puis de le vidanger périodiquement pendant votre boucle (et de rétablir le pool de libération automatique après l'avoir drainé).

+0

J'ai beaucoup de pools autorelease tout au long des boucles d'exécution dans mon programme ... – ambientdiscourse

+0

Vous les vider? Ma réponse était juste une supposition, je ne suis pas sûr que nous pouvons faire beaucoup de choses sans voir votre code. –

+0

Oui, je les égoutte. Mon code est assez long, c'est pourquoi je ne l'ai pas posté. De plus, j'ai oublié de mentionner que l'instrument de fuite ne signale aucune fuite. Voici l'essentiel de ce que fait mon programme ... peut-être que ça va aider. Le programme s'exécute sur une minuterie (définie à 30 secondes pour le débogage), lorsque le minuteur se déclenche, il appelle certaines méthodes qui font un NSURLConnection pour un poste HTTP, puis analyser les données JSON et faire des choses avec les données. Quoi qu'il en soit ... Je suppose que ma question fondamentale est la suivante: pourquoi les allocations et l'utilisation réelle de ma mémoire de programme ne correspondent-elles pas? – ambientdiscourse

0

Vous pouvez utiliser Instruments pour trouver l'emplacement de l'endroit où vos allocations sont originaires. Lors de l'exécution Instruments en mode d'allocation:

  • Déplacez votre souris sur l'Catégorie champ dans le objet Résumé
  • Cliquez sur le cercle gris avec une flèche qui apparaît à côté le nom du champ

Cela fera apparaître une liste d'endroits où les objets dans ce chat ont été instanciés à partir de, et les statistiques du nombre d'allocations ont été faites.

Si votre utilisation de la mémoire est en hausse (mais ne fuit pas), vous devriez être en mesure de voir où cette mémoire a été créée, puis traquer pourquoi elle traîne.

Cet outil est également très utile pour réduire votre profil de mémoire pour les applications mobiles.

+1

Et les applications non-mobiles. –

+0

@Peter: en effet. Mais je me trouve plus préoccupé par mon profil de mémoire sur le premier. – Akusete

1

Courez-vous avec différentes variables d'environnement lorsque vous exécutez dans des environnements différents? Par exemple, NSZombie peut-il être activé lorsque vous lancez votre application (tous vos objets ne sont pas libérés), mais pas lorsque vous exécutez Instruments?

Juste pour une vérification d'intégrité - Comment déterminez-vous l'utilisation de la mémoire? Vous dites que l'utilisation de la mémoire continue à augmenter, mais pas lorsque vous utilisez des instruments. Étant donné que Instruments est un moyen fiable de mesurer l'utilisation de la mémoire (la manière la plus fiable?) Cela semble un peu étrange - un peu comme dire que la mémoire continue de monter sauf quand j'essaie de la mesurer.

+0

Je mesure mon utilisation "réelle" de la mémoire en regardant le moniteur d'activité lors de l'exécution de mon programme (pas de xcode). Après avoir essayé l'analyse de la mémoire dans les instruments, il semble que la plupart des fuites proviennent des frameworks et non de mes propres allocations. – ambientdiscourse