Partager via


Terminologie de la mémoire

Les termes suivants sont utilisés dans l’outil Mémoire , qui sert à examiner les problèmes de mémoire. Ces termes de mémoire s’appliquent à l’analyse de la mémoire en général, ainsi qu’aux outils de profilage de la mémoire pour des langages tels que Java ou .NET.

Pour en savoir plus sur l’utilisation de l’outil Mémoire , consultez Enregistrer des instantanés de tas à l’aide de l’outil Mémoire.

Graphique de la mémoire

Imaginez la mémoire utilisée par une page web comme un graphe : structure qui contient des nœuds connectés entre eux par des arêtes :

Représentation visuelle de la mémoire

Les nœuds du graphe de mémoire représentent les objets utilisés par la page, y compris les types primitifs tels que les nombres ou les chaînes JavaScript, et les objets tels que les tableaux associatifs. Les nœuds et les arêtes du graphe de mémoire reçoivent les étiquettes suivantes :

  • Les nœuds (ou objets) sont étiquetés à l’aide du nom de la fonction de constructeur utilisée pour les générer.

  • Les arêtes sont étiquetées à l’aide des noms des propriétés.

Un nœud dans le graphe peut contenir de la mémoire de deux manières :

  • Directement; la mémoire est détenue par l’objet lui-même.

  • Implicitement, en conservant des références à d’autres objets. Un objet qui contient des références à d’autres objets empêche la suppression automatique de ces objets par le garbage collection (GC).

Mémoire du tas et du renderer JavaScript

Le tas JavaScript est une région de mémoire dans le processus du navigateur où tous les objets JavaScript et WebAssembly se trouvent. Le tas JavaScript est également appelé mémoire V8 (après le moteur JavaScript V8 qui alimente Microsoft Edge).

Le tas JavaScript fait partie de la mémoire du renderer. La mémoire du renderer est la mémoire utilisée par le processus de navigateur où la page web est rendue. La mémoire du renderer est composée des éléments suivants :

  • Mémoire native, telle que la mémoire utilisée par les objets C++ qui représentent les nœuds DOM.
  • Mémoire du tas JavaScript de la page.
  • Mémoire du tas JavaScript de tous les workers dédiés démarrés par la page.

L’outil Mémoire affiche les deux éléments suivants :

  • Mémoire V8.
  • Objets alloués dans la mémoire native qui sont pertinents pour la page web rendue.

Racines du garbage collection

Les racines du garbage collection (racines GC) sont créées par le navigateur lorsqu’une référence est effectuée à partir du code natif du navigateur à un objet JavaScript qui se trouve en dehors de la machine virtuelle V8. Ces références sont appelées handles.

Il existe de nombreuses racines gc internes, dont la plupart ne sont pas intéressantes pour les développeurs web. Du point de vue de la page web, les types de racines GC suivants existent :

  • Objets globaux de fenêtre (un dans chaque iframe).

  • Parfois, les objets sont conservés par le contexte de débogage défini par l’outil Sources ou Console , par exemple lors de l’évaluation d’une expression JavaScript dans l’outil Console . Pour supprimer ces objets de l’outil Mémoire, avant d’enregistrer un tas instantané, effacez l’outil Console et désactivez les points d’arrêt dans l’outil Sources.

Le graphique mémoire commence par une racine GC, qui peut être l’objet window du navigateur ou l’objet Global d’un module Node.js. Vous ne contrôlez pas la façon dont l’objet racine est récupéré par la mémoire :

Vous ne pouvez pas contrôler la façon dont l’objet racine est récupéré par la mémoire

Les nœuds qui ne sont pas accessibles à partir de la racine peuvent être récupérés par la mémoire.

Tailles et distances des objets

Lorsque vous utilisez l’outil Mémoire , vous trouverez probablement les colonnes d’informations suivantes :

  • Distance
  • Taille superficielle
  • Taille conservée

Colonnes Distance, Taille superficielle et Taille conservée dans l’outil Mémoire

Les nombres dans les colonnes Taille superficielle et Taille conservée correspondent au nombre d’octets.

Distance

La distance d’un objet dans le tas JavaScript est le nombre de nœuds sur le chemin d’accès le plus court entre l’objet et la racine GC. Plus la distance est courte, plus il est probable que cet objet joue un rôle important dans l’utilisation de la mémoire de la page web.

Taille superficielle

La taille superficielle est la taille du tas JavaScript qui est directement détenu par un objet. La taille superficielle d’un objet est généralement petite, car un objet JavaScript stocke souvent uniquement sa description de l’objet, et non les valeurs, dans la mémoire directement détenue de l’objet. La plupart des objets JavaScript stockent leurs valeurs dans un magasin de stockage qui se trouve ailleurs dans le tas JavaScript et exposent uniquement un petit objet wrapper sur la partie du tas JavaScript qui appartient directement à l’objet.

L’outil Mémoire peut être configuré pour signaler la taille de mémoire totale des objets au lieu de la taille de mémoire qu’ils contiennent directement. Pour plus d’informations, consultez Configurer la colonne Taille superficielle pour inclure la taille entière d’un objet dans Enregistrer des instantanés de tas à l’aide de l’outil Mémoire.

Néanmoins, même un petit objet peut contenir une grande quantité de mémoire indirectement, en empêchant d’autres objets d’être supprimés par le processus de garbage collection.

Taille conservée

La taille conservée correspond à la taille de la mémoire qui est implicitement détenue par un objet et qui peut être libérée une fois que l’objet et les autres rétentions existantes sont supprimés, ainsi que tous les objets dépendants qui ont été rendus inaccessibles à partir des racines gc.

Autrement dit, la taille conservée d’un objet correspond à la quantité de mémoire qui serait récupérée si l’objet et tous ses objets dépendants étaient supprimés du graphique de mémoire.

La taille conservée ne peut pas être inférieure à la taille superficielle.

Lorsqu’un objet est conservé par plusieurs nœuds, la taille de l’objet apparaît dans la taille conservée du nœud de rétention qui a le chemin d’accès le plus court à la racine du GC.

Serviteurs

Les rétentions d’un objet sont les autres objets qui contiennent des références à l’objet . La section Retainers de l’outil Mémoire affiche les objets qui contiennent des références à l’objet sélectionné dans l’affichage Résumé .

La section Rétentions de l’outil Mémoire est triée par distance par défaut, ce qui signifie que les chemins de conservation les plus simples pour un objet sont affichés en premier.

Tout objet sans rétention peut être ignoré par le garbage collector du navigateur, ce qui réduit l’utilisation de la mémoire.

Spécificités de V8

Lors du profilage de la mémoire, il est utile de comprendre pourquoi les instantanés de tas se présentent d’une certaine façon. Cette section décrit comment certains objets sont stockés en mémoire par la machine virtuelle JavaScript V8 (abrégée ici en machine virtuelle V8, ou simplement machine virtuelle), ce qui peut vous aider lors de l’analyse des instantanés de tas dans l’outil Mémoire .

Primitives JavaScript

Dans JavaScript, il existe plusieurs types primitifs, tels que :

  • Nombres (tels que 3.14159).
  • Booleans (true ou false).
  • Chaînes (telles que "Werner Heisenberg").

Les primitives ne peuvent pas référencer d’autres valeurs et sont toujours des nœuds feuilles (également appelés nœuds de fin) dans le graphique de mémoire.

Les nombres peuvent être stockés sous la forme suivante :

  • Valeurs entières 31 bits immédiates appelées petits entiers (SMI).

  • Objets de tas, appelés nombres de segments de mémoire. Les nombres de segments de mémoire sont utilisés pour stocker des valeurs qui ne tiennent pas dans la forme d’entier petit (SMI), telles que des valeurs de type double, ou lorsqu’une valeur doit être encadrée, comme la définition de propriétés sur celle-ci.

Les chaînes peuvent être stockées dans :

  • Tas de machine virtuelle.

  • En externe dans la mémoire du renderer. Un objet wrapper est créé et utilisé pour accéder au stockage externe où, par exemple, les sources de script et d’autres contenus reçus du web sont stockés, plutôt que copiés sur le tas de machine virtuelle.

Objets JavaScript

La mémoire pour les nouveaux objets JavaScript est allouée à partir d’un tas JavaScript dédié (ou tas de machine virtuelle). Ces objets sont gérés par le récupérateur de mémoire de la machine virtuelle V8 et, par conséquent, ces objets restent actifs tant qu’il y a au moins une référence à eux.

Autres objets

  • Objets natifs : tout ce qui n’est pas stocké dans le tas JavaScript est appelé objet natif. Un objet natif, contrairement à un objet tas, n’est pas géré par le récupérateur de mémoire V8 tout au long de sa durée de vie et n’est accessible qu’à partir de JavaScript à l’aide de son objet wrapper JavaScript.

  • Chaînes concaténées : les chaînes stockées, puis jointes, à la suite d’une concaténation de chaînes en JavaScript, sont stockées en tant que chaînes concaténées dans V8. La jointure du contenu de la chaîne se produit uniquement en fonction des besoins, par exemple lorsqu’une sous-chaîne d’une chaîne jointe doit être construite.

    Par exemple, si vous concatènez a et b, vous obtenez une chaîne (a, b) concaténée qui représente le résultat de la concaténation. Si vous concatènez ultérieurement c avec ce résultat, vous obtenez une autre chaîne concaténée : ((a, b), c).

  • Tableaux : un tableau est un objet qui a des clés numériques. Les tableaux sont largement utilisés dans la machine virtuelle V8 pour stocker de grandes quantités de données. Les ensembles de paires clé-valeur utilisés comme des dictionnaires sont implémentés en tant que tableaux.

    Un objet JavaScript classique est stocké comme un seul des deux types de tableau :

    • Tableau pour le stockage des propriétés nommées.
    • Tableau pour le stockage des éléments numériques.

    Lorsqu’il existe un petit nombre de propriétés, les propriétés sont stockées en interne dans l’objet JavaScript.

  • system /Map : objet qui décrit à la fois le type d’objet qu’il est et la disposition. Par exemple, les objets système/mappage sont utilisés pour décrire les hiérarchies d’objets implicites pour un accès rapide aux propriétés. Consultez Propriétés rapides dans V8.

Remarque

Les parties de cette page sont des modifications basées sur le travail créé et partagé par Google et utilisées conformément aux termes décrits dans la licence internationale Creative Commons Attribution 4.0. La page d’origine est disponible ici et est créée par Meggin Kearney (Rédacteur technique).

Licence Creative Commons Cette œuvre est concédée sous licence creative commons attribution 4.0 international.