Debuguer la corruption mémoire heap avec jemalloc sur Node.js

brun-isaac 23/05/2026
RÉSOLU
brun-isaac
Auteur
Avatar de brun-isaac
brun-isaac
Auteur

Salut à tous, je fais face à un problème étrange sur un service critique en production. Mon processus Node.js subit des crashs aléatoires avec un signal SIGSEGV sans aucune stack trace explicite dans les logs. Après avoir activé jemalloc pour gérer l'allocation mémoire, je vois des pics de fragmentation énormes.

Est-ce que quelqu'un a déjà réussi à corréler des fuites mémoire natives avec des objets JavaScript qui ne sont pas correctement libérés par le garbage collector ?

23/05/2026 à 16:58

13 commentaires

nmonnier
Membre
Avatar de nmonnier
nmonnier
Membre

C'est un classique. As-tu vérifié si tu n'as pas des fuites dans tes modules C++ natifs ? Parfois, l'allocation via node-gyp ne suit pas les règles de vie du heap V8.

24/05/2026 à 07:21
brun-isaac
Auteur
Avatar de brun-isaac
brun-isaac
Auteur

J'ai audité mes dépendances, rien de flagrant. Mais j'utilise beaucoup de buffers partagés entre le main thread et les worker threads.

25/05/2026 à 01:06

Tente de lancer ton processus avec --max-old-space-size restreint pour forcer le GC. Si ça crash plus vite, c'est que ton heap est saturé par des références fantômes.

25/05/2026 à 15:16
emilie-francois
Membre Actif
Avatar de emilie-francois
emilie-francois
Membre Actif

Utilise heapdump pour générer un snapshot au moment où la mémoire commence à monter. Compare deux snapshots avec Chrome DevTools pour isoler les objets qui persistent.

26/05/2026 à 03:38
brun-isaac
Auteur
Avatar de brun-isaac
brun-isaac
Auteur

Bonne idée, je vais essayer de comparer les snapshots. Je suspecte un EventEmitter qui garde des listeners actifs sur des objets qui devraient être détruits.

27/05/2026 à 01:58
nmonnier
Membre
Avatar de nmonnier
nmonnier
Membre

Vérifie aussi si tu n'as pas des promesses qui ne se résolvent jamais. Une Promise en attente garde tout son contexte lexical en mémoire.

27/05/2026 à 23:17

Et côté jemalloc, as-tu ajusté les variables d'environnement MALLOC_CONF ?

28/05/2026 à 12:37
brun-isaac
Auteur
Avatar de brun-isaac
brun-isaac
Auteur

J'ai testé avec background_thread:true,metadata_thp:auto, ça a un peu stabilisé le RSS, mais le problème de SIGSEGV persiste.

29/05/2026 à 10:11
emilie-francois
Membre Actif
Avatar de emilie-francois
emilie-francois
Membre Actif

Si c'est un SIGSEGV, c'est probablement un accès mémoire invalide. Tente de lancer ton app sous valgrind en staging, même si c'est lent, ça te donnera l'adresse exacte du fault.

30/05/2026 à 04:10
nmonnier
Membre
Avatar de nmonnier
nmonnier
Membre

Ou utilise gdb pour inspecter le core dump avec gcore. C'est plus rapide que valgrind.

30/05/2026 à 21:21
brun-isaac
Auteur
Avatar de brun-isaac
brun-isaac
Auteur

Je vais faire ça. Je vous tiens au courant si le core dump révèle un pointeur nul dans l'un de mes bindings natifs.

31/05/2026 à 14:49

Tiens-nous au courant, c'est le genre de bug qui rend fou.

01/06/2026 à 10:04
brun-isaac
Auteur
Avatar de brun-isaac
brun-isaac
Auteur

Verdict : c'était bien une bibliothèque native obsolète qui tentait d'écrire dans un buffer déjà libéré par le GC. Mise à jour effectuée, le crash a disparu.

01/06/2026 à 22:53

Laisser une réponse

Vous devez être connecté pour poster un message !

Rejoindre la communauté

Recevoir les derniers articles gratuitement en créant un compte !

S'inscrire