Exercice 1.3 : Analyse des candidats de fuite
Avant de commencer, vous devez terminer l'Exercice 1.2 : Capture des vidages de tas.
Dans cet exercice, vous allez d'abord générer une liste des objets (matrices, vecteurs et sessions par exemple) qui semblent présenter des fuites. Il s'agit des "candidats de fuite". Vous analyserez ensuite cette liste pour identifier les fuites.
Génération d'une liste de candidats de fuite
Pour générer la liste :
- D'après les instructions de la vue Candidats de fuite, cliquez sur le bouton de la barre d'outils Analyser des fuites
. La boîte de dialogue Sélectionner les options d'analyse de fuite s'ouvre.
- Dans la boîte de dialogue, vérifiez que les cases correspondant aux deux vidages de tas sont cochées.
Remarque : la valeur du seuil est définie par défaut sur 20. Cela signifie que seuls les candidats de fuite dont la valeur de probabilité est supérieure ou égale à 20 sont affichés. (Pour en savoir plus sur les valeurs de probabilité, lisez les sections suivantes de cet exercice.)
- Cliquez sur OK pour générer la liste. L'indicateur situé en bas à droite de la vue Software Development Platform signale qu'il a détecté des candidats de fuite.
Généralités sur la vue Candidats de fuite
Une fois le processus terminé, une liste de candidats de fuite s'affiche dans la vue correspondante.
Chaque candidat possède une valeur de probabilité comprise entre 1 et 100, le candidat le plus probable ayant une valeur de 100. Les autres candidats sont classés en conséquence, dans l'ordre décroissant de probabilité.
(L'algorithme de comparaison des tas calcule les valeurs de probabilité en fonction de la taille de la fuite et de son évolution pendant l'intervalle entre les deux vidages de tas.)
La valeur de seuil a été définie sur 20 pour cette exécution de profilage ; les candidats dont la valeur de probabilité est inférieure ou égale à 19 ne seront pas affichés.
La vue fournit les données suivantes sur chaque candidat de fuite :
- Racine de la fuite : objet racine de niveau supérieur qui contient les références aux objets présentant des fuites éventuelles.
- Type de conteneur : objet de collecte qui contient les objets présentant des fuites. Les fuites sont plus susceptibles de se produire dans des objets de collecte comme les vecteurs et les listes.
- Description de la fuite : types d'objet présentant des fuites.
- Nombre de fuites : nombre d'objets du type indiqué dans la colonne "Description de la fuite" et présents dans l'objet conteneur. Ces objets peuvent eux-mêmes faire référence à d'autres objets, indiqués dans les colonnes "Objets perdus" et "Octets perdus".
- Octets perdus.
- Objets perdus.
Analyse et identification de la fuite
Pour identifier la fuite :
- Dans la vue Candidats de fuite, analysez les données du candidat de fuite dont la probabilité est égale à 100 :
- la racine de la fuite est TestThreeTierQueue.<ObjectID>.
- Le type de conteneur est Vector.
- Le vecteur perd des chaînes. En d'autres termes, le vecteur contient des références à des chaînes qu'il devrait libérer, si l'on en juge par le nombre de fuites et le nombre d'objets perdus, pour permettre à l'opération de nettoyage de la mémoire de récupérer de la place. (Le nombre de fuites et d'octets perdus variera probablement à chaque nouvelle exécution du programme, en fonction de la fréquence de capture des vidages de tas.)
- Cliquez deux fois sur le candidat de fuite. La vue Graphique de références objet s'ouvre et affiche les données graphiques du candidat de fuite. (Notez que le délai d'affichage du vidage de tas peut prendre un certain temps.)
- Examinez le graphique de références de l'objet. Notez les points suivants :
- le graphique met en évidence les objets qui sont associés à la fuite potentielle par des références : de la racine de la fuite à l'ensemble de chaînes perdu, en passant par la SecondaryQueue et le vecteur. Vous obtenez ainsi une image visuelle des fuites.
- Dans le graphique, une matrice Object est référencée par un Vector (type de conteneur impliqué dans la fuite) et elle contient les objets String présentant des fuites.
- Placez votre curseur sur le chemin qui relie la matrice Object à l'objet String, puis lisez l'infobulle qui s'affiche : elle indique un "Nombre" égal au nombre de fuites indiqué dans la vue Candidats de fuite ; c'est donc cet ensemble de chaînes qui a été identifié comme fuite.
- Notez que les files d'attente secondaire et tertiaire contiennent chacune des références à la matrice Object mais que la file d'attente tertiaire n'est pas identifiée comme présentant une fuite dans la vue Candidats de fuite. Il existe plusieurs explications :
- il se peut que la file d'attente tertiaire présente aussi des fuites mais que leur débit soit inférieur à celui de la file d'attente secondaire. Si vous effectuez une nouvelle analyse des fuites avec une valeur de seuil inférieure à 20 (valeur par défaut), vous verrez peut-être une fuite s'afficher pour la file d'attente tertiaire.
- La file d'attente tertiaire peut avoir de bonnes raisons de conserver les références à la matrice [Object, notamment afin que la mémoire ne présente pas de fuite et soit simplement conservée. Pour connaître la réponse, réparez le code de la file d'attente secondaire et relancez l'application améliorée.
- Dans le graphique de références objet, cliquez deux fois sur l'objet String. La vue Détails sur l'objet s'ouvre. Elle affiche toutes les données concernant l'objet String, y compris tous les objets qui s'y rapportent et tous ceux auxquels il fait lui-même référence. Notez que dans la vue Détails sur l'objet, vous pouvez remonter jusqu'aux référenceurs ou descendre jusqu'aux référencés (objets auxquels la chaîne se rapporte) en cliquant sur l'un d'entre eux.
Quelles sont vos conclusions ? Vous devez maintenant savoir que l'objet qui présente des fuites est la file d'attente secondaire et que ces fuites sont dues à un objet Vector qui conserve des références à plusieurs objets String.
Vous êtes maintenant prêt à aborder l'Exercice 1.4 : Correction de la fuite de mémoire.