Avant de commencer
Rendez-vous dans l’onglet Memory de vos DevTools
Ouvrez les DevTools, puis choisissez l’onglet Memory. C’est ici que nous allons observer ce qui vit encore dans le heap.
Inventaire
1. Un heap snapshot photographie le heap
Un heap snapshot est l’inventaire des objects présents à un instant donné. Il ne raconte pas toute l’histoire du programme : il répond à la question « qu’est-ce qui est encore en mémoire, et pourquoi ? ».
Première lecture
2. Le snapshot vient d’être pris
Le compteur du JS heap attire l’attention ; le snapshot permet d’identifier les constructors, les objects et les references qui composent cette mémoire.
Méthode
3. Identifiez le coupable
- Dans le lab des bases, cliquez Create 1 structure. Cette unique structure prend environ 70 à 80 MiB dans le JS heap.
- Prenez immédiatement un nouveau heap snapshot — aussi appelé profile. La structure y est déjà visible.
- Facultatif : filtrez sur le constructor
Brol, puis sélectionnez une instance. - Ouvrez son retaining path et remontez jusqu’à une root. C’est ce chemin qui explique pourquoi l’object est encore reachable.
Brol dans le profile : le coupable est facile à isoler.C’est une caricature : la réalité en boîte de Petri. Ici, l’object est énorme et le coupable se voit immédiatement. La pratique vous aidera ensuite à reconnaître la même logique dans les petites black widows de vos futurs codebases : moins visibles, mais tout aussi dangereuses.
Forage
4. Creusez jusqu’à l’origine
Dépliez l’entry retenue et observez Distance : c’est le nombre de references qui séparent l’object d’une root. Plus que la taille, cette distance vous donne le début du chemin à explorer.
Plus important encore : la ligne de code responsable de la création de l’object est conservée dans le snapshot. Un clic vous y amène directement.
createStructure, makeClumsyEntries — indiquent où les gros objects ont été créés ou retenus.Ce panneau permet de remonter des gros objects jusqu’à leur origine dans le code. La démonstration est délibérément voyante ; dans un vrai codebase, la même enquête révèle des coupables plus petits, mais plus dangereux.
Comparaison
5. Comparez ce qui a changé
Deux snapshots ne servent pas seulement à constater une hausse : DevTools peut comparer le second au premier et isoler les objects apparus, disparus ou dont la mémoire retenue a changé.
- Prenez un premier snapshot avant l’action : c’est votre référence.
- Exécutez le scénario, puis prenez un second snapshot.
- Dans Comparison, sélectionnez le premier snapshot pour voir ce que le scénario a réellement ajouté ou retenu.
Exercice
6. À vous de jouer
Créez maintenant un clumsy batch : 10 000 structures de deux Brol chacune sont alors en mémoire, retenues par myClumsyArray.
myClumsyArray très visible, sans devoir créer un object géant à la fois.- Cliquez Batch create (clumsy), puis prenez un heap snapshot.
- Retrouvez les
Broldans le profile et observez ce qui les retient. - Cliquez Proper cleanup, puis prenez un nouveau snapshot.
- Comparez les deux snapshots pour voir la différence.
Shallow size, c’est la place prise par cet object seul. Retained size, c’est ce que le garbage collector pourrait libérer si vous coupiez sa dernière reference : l’object lui-même, plus tous ceux qui ne sont accessibles qu’à travers lui. C’est donc la mesure de l’impact réel de cette reference.
Preuve
7. Une hausse n’est pas encore un memory leak
Pour conclure, reliez toujours un scénario, deux mesures comparables et un retaining path. Dans le lab des bases, ce chemin peut passer par currentA ; dans le batch volontairement maladroit, il passe par window.memoryLeakLab.myClumsyArray.
Un object présent dans un snapshot n’est pas forcément un problème. Il devient suspect lorsque son retaining path le garde reachable après que le scénario qui devait le libérer est terminé.