Comprendre la mémoire en Javascript

Cycle de vie de la mémoire, Heap, Stack... Cet article vous présente les bases indispensables pour comprendre la mémoire en Javascript

Qu'est ce que la mémoire ?

La mémoire, en informatique, est un dispositif électronique qui permet de stocker de données. Elle se présente sous différentes forme, la mémoire vive, la mémoire morte ou la mémoire de masse.

Dans le développement, certains langages bas niveau permettent une gestion avancée de la mémoire comme en C, avec malloc() et free() qui permettent respectivement d'allouer un espace mémoire et de libérer un espace mémoire.

En Javascript, l'allocation mémoire se fait automatiquement mais nous allons voir qu'il est intéressant de comprendre comme celle-ci fonctionne pour optimiser les performances de ses applications.

Le cycle de vie d'un espace mémoire

Le cycle de vie d'un espace mémoire est assez simple :

  • Allouer un espace mémoire
  • Lire ou écrire sur cet espace
  • Libérer l'espace mémoire

En javascript, l'allocation et la libération sont fait de façon implicite. En revanche, comme dans tous les langages de programmation, la lecture et l'écriture sont fait de manière explicite.

Cycle de vie d'un espace mémoire

Allouer un espace mémoire

Pour allouer un espace mémoire en Javascript, il suffit de déclarer une variable. Il existe différents types d'allocation mémoire (statique et dynamique) mais nous y reviendrons plus tard.

Voici quelques exemples :

// allocation pour un number
const a = 1

// allocation pour une string
const b = "John"

// allocation pour un object
const c = {
    c1: 1,
    c2: "Billy"
}

// allocation pour un object
const d = [1, 2, 3]

// allocation pour une fonction
function e(e1) {
    return e1 + 2
}

Lorsque l'on parle de mémoire, les 'object' incluent les types object, les array et les function. C'est-à-dire que la gestion de la mémoire (allocation et libération) et faite de façon identique pour tous ces types.

Mémoire Statique vs Dynamique en Javascript

En Javascript, on distingue deux types de mémoires, la mémoire dite statique (stack) et la mémoire dite dynamique (heap).

Vous avez d'ailleurs peut-être déjà entendu ces deux mots mais nous allons voir quelles sont leurs réels différences.

La stack

La mémoire statique (stack) est utilisé pour l'allocation de mémoire dont on connaît la taille au moment de la compilation. Cela inclut les valeurs primitives en Javascript (number, string, boolean, undefined et null). La stack est aussi en charge de stocker les références à des objets ou des fonctions mais nous y reviendrons.

La stack est une liste d'éléments qui répond au principe FILO (first-in, last-out). Cela signifie que le premier élément ajouté à la stack sera le dernier à la quitter.

Stack

La heap

La mémoire dynamique (heap) est utilisé pour l'allocation de mémoire dont on ne connaît la taille qu'à l'exécution. C'est le cas pour les object, array et function.

A la différence de la stack, la heap n'alloue pas un espace mémoire de taille défini. L'espace peut évoluer lors de l'éxecution.

Heap-solo

En Javascript, la heap ne fonctionne pas seule. Chaque espace alloué par le moteur Javascript possède une référence à cette espace dans la stack. C'est ce qu'on appelle un pointeur. Très simplement, on stocke dans la stack, le numéro de l'espace mémoire alloué afin de retrouver notre information.

Voici un schéma ci-dessous qui représente un cas concret.

Heap

Le comparatif entre la mémoire Statique et Dynamique

memoire-dynamique-vs-statique
memoire-dynamique-vs-statique

Dans ce premier article, nous avons fait une introduction à la mémoire en Javascript afin de découvrir son fonctionnement et son utilisation.

Ce qu'il faut retenir :

  • Le cycle de vie d'un espace mémoire est : Allouer, Lire/Ecrire, Libérer
  • Mémoire statique = La stack
  • Mémoire dynamique = La heap

➡️ Pour recevoir toutes les semaines un article sur le développement web et son écosystème, n'hésitez pas à suivre codeNews sur LinkedIn. 🗞

Apprenez à programmer avec des exemples simples et concrets.

English / Français