Question

J'ai un peu d'une fuite problème dans mon application Flex mémoire et la version courte de ma question est la suivante: est-il possible (en AcitonScript 3) pour trouver toutes les références en direct à un objet donné

?

Ce que j'ai un certain nombre de vues avec les modèles de présentation derrière chacun d'eux (en utilisant Swiz). Les vues d'intérêt sont les enfants d'un TabNavigator, quand je ferme l'onglet, la vue est retiré de la scène. Lorsque l'affichage est retiré de la scène, Swiz définit la référence de modèle en vue de zéro, comme il se doit. J'ai aussi removeAllChildren () de la vue.

Toutefois, lorsque le profil de la demande, quand je fais cela et exécuter un GC, ni la vue ni le modèle de présentation sont libérés (bien que les deux ensemble leurs références à l'autre à null). Un objet modèle utilisé par la vue (pas un présentateur, si) est libéré, il est donc pas complètement cassé.

Je viens juste de commencer le profilage aujourd'hui (croire fermement à ne pas optimiser trop tôt), donc je suppose qu'il ya une sorte de référence flottant autour de quelque part, mais je ne vois pas où, et ce serait super utile serait le capacité de mise au point et voir une liste d'objets qui font référence à l'objet cible. Est-ce possible, et sinon en mode natif, est-il un moyen léger au code des applications futures dans ce à des fins de débogage?

Vive.

Était-ce utile?

La solution

En supposant que vous utilisez Flex Builder, vous pouvez essayer le Générateur de profils. Dans mon expérience, ce n'est pas si bon pour la performance de profilage, mais il a été d'une grande aide pour trouver des fuites de mémoire.

Il est pas le plus outil intuitif et il faut un certain temps pour s'y habituer (je veux dire, au point où il devient réellement utile). Mais, à mon avis, consacrer du temps à apprendre au moins les bases est payant. Il y a une énorme différence entre voir juste la quantité de mémoire que le joueur utilise globalement (ce System.totalMemory vous donne, un, imprécis très rugueux et souvent indicateur trompeur) et de suivre réellement comment ont été créés de nombreux cas de chaque objet, combien sont encore vivants et où ont-ils été attribués (afin que vous puissiez trouver la fuite potentielle dans le code et fait réparer au lieu de compter dans la magie noire).

Je ne sais pas de tout bon tutoriels pour le profileur de FB, mais peut-être cela va aider à démarrer.

D'abord, lancez le profileur. Décocher profilage performance et vérifier tout le reste (Activer le profilage de la mémoire, contrôler les données de la mémoire en direct et générer des traces de pile d'allocation d'objets).

Lorsque le début profileurs, vous verrez les statistiques sur les objets app, regroupés par classe. À ce stade, vous pouvez modifier les filtres. Vous verrez beaucoup de données et il est très facile d'être submergé. Pour l'instant, tout ignorer natif à clignoter et d'autres choses flex, si possible, et se concentrer sur un objet que vous pensez qu'il devrait recueillir.

Les figures les plus importantes sont des "cas cumulatifs" et "instances". Le premier est le nombre total d'instances créées à ce jour; le second, le nombre de ces cas qui sont encore en vie. Donc, un bon point de départ est d'obtenir votre application à l'état où la vue que vous soupçonnez que les fuites est créé. Vous devriez voir 1 pour « cas cumulatifs » et « instances ».

Maintenant, faites tout ce que vous devez faire pour arriver au point où ce point de vue doit être nettoyé (navigate à l'autre partie de l'application, etc.) et exécuter un GC (il y a un bouton pour que dans l'interface utilisateur de profileur). Un point crucial est que vous allez vérifier le comportement de l'application par rapport à vos attentes -si qui fait sens-. Trouver des fuites automatiquement dans un environnement de collecte garbarge est presque impossible par définition; sinon, il n'y aurait pas de fuites. Alors, gardez cela à l'esprit: vous tester contre vos attentes; vous êtes celui qui connaît le cycle de vie de vos objets et peut dire « à ce point cet objet aurait dû être perçu, si ce n'est pas, il y a quelque chose de mal »

.

Maintenant, si le « cas » compte pour vous voir va à 0, il n'y a pas de fuite là. Si vous pensez que les fuites d'applications, essayez de trouver d'autres objets qui pourraient ne pas avoir été correctement disposés. Si le nombre reste à 1, cela signifie que votre vue est une fuite. Maintenant, vous devez trouver pourquoi et où.

À ce stade, vous devriez prendre un « instantané de la mémoire » (le bouton à côté du bouton force GC). Ouvrez l'instantané, trouver l'objet dans la grille et double-cliquez dessus. Cela vous donnera une liste de tous les objets qui ont une référence à cet objet. Il est en fait un arbre, et probablement chaque élément contiendra à son tour un certain nombre de références arrières et ainsi de suite. Ce sont les objets qui empêchent votre point de vue d'être collectées. Dans le panneau de droite, aussi, vous aurez une trace d'allocation. Cela montrera comment l'objet sélectionné a été créé (à peu près comme une trace de la pile).

Vous verrez probablement un certain nombre d'objets hugh là-bas. Mais votre meilleur pari est de se concentrer dans ceux qui ont un cycle de vie plus longue que l'objet que vous examinez (votre point de vue). Ce que je veux dire est, regard pour la scène, une vue parent, etc; objets sur lesquels votre point de vue dépend plutôt que qui dépendent objets vous, si cela fait sens. Si votre vue a un bouton et vous avez ajouté un auditeur, votre bouton aura une ref à votre vue. Dans la plupart des cas, ce n'est pas un problème, puisque le bouton dépend de la vue et une fois que la vue est collect, est donc le bouton. Donc, l'idée est que, comme il y a beaucoup d'objets, vous devriez essayer de rester concentré ou vous mènera nulle part. Cette méthode est assez heuristique, mais dans mon expérience, cela fonctionne.

Une fois que vous trouver la source d'une fuite, revenir à la source, changer le code en conséquence (peut-être cela nécessite non seulement de changement de code, mais un peu refactoring). Ensuite, répétez le processus et vérifier si votre changement a provoqué l'effet désiré. Il peut prendre un certain temps, en fonction de la taille ou complexe est votre application et combien vous en savez. Mais si vous allez étape par étape, trouver et corriger un problème à l'époque, vous finirez par vous débarrasser des fuites. Ou au moins les pires et les plus évidents. Ainsi, alors qu'un fastidieux bits, elle est payante (et comme une belle côté, vous finirez par comprendre ce qu'est un gaspillage de temps est dans la plupart des cas d'utiliser refs faibles pour chaque gestionnaire d'événements unique sur la face de cette terre, annulant à chaque seule variable, etc, etc, c'est une expérience enrichissante;).

Hope this helps.

Autres conseils

Flash GC utilise un mélange de comptage ref et la marque et de balayage, de sorte qu'il ne détecte des références circulaires. Il semble plutôt que vous rencontrez une autre référence en vous opposez graphique. La raison la plus commune est que les objets que vous voulez disposés sont toujours des gestionnaires d'événements enregistrés sur des objets qui ne sont pas éliminés. Vous pouvez essayer de faire en sorte que les gestionnaires sont toujours enregistrés en référence faible. Vous pouvez également remplacer addEventListener et removeEventListener dans toutes les classes (de base), si possible, à regarder que les auditeurs sont enregistrés et s'il y a des chances pour certains de ne pas être supprimés.

En outre, vous pouvez écrire vos objets pour Destructeurs, que pour les composants graphiques ui clairs et supprimer tous les enfants, et pour tous les objets, supprime les références à toutes les propriétés. De cette façon, que votre objet est conservé dans la mémoire vive, qui ne devrait pas exiger beaucoup de mémoire (un faible encombrement de 20 B ou si, plus 4 B par variable (8 pour un numéro)).

greetz
back2dos

aussi un heuristiques utiles pour trouver des fuites de mémoire: http://www.tikalk.com/flex/solving-memory-leaks-using-flash-builder-4-profiler

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top