Une fuite de mémoire mystérieuse ralentissait notre application depuis des mois. Personne n'osait s'y attaquer.
J'ai décidé de relever le défi.
Vous connaissez ce sentiment ?
Quand vous savez qu'un problème existe, mais personne ne prend le temps de le résoudre ?
Armé de détermination et d'un bon café, j'ai plongé dans le code.
Premier réflexe : ouvrir les DevTools et faire un Heap snapshot.
Ce que j'ai découvert m'a surpris :
Des d'objets mystérieux avec seulement deux propriétés, _𝗻𝘀_𝗻𝗮𝗺𝗲 et 𝗶𝗱.
Mais surtout, chacun avait comme prototype un objet similaire qui lui même avait un prototype similaire qui lui même ....
Bref tu vois le bye.
La chaîne de prototypes était si longue que je n'arrivé pas à l'afficher entièrement dans le DevTools 🤯
Après plusieurs heures d'investigation acharnée, j'ai finalement identifié le coupable : la bibliothèque 𝗰𝗹𝘀-𝗵𝗼𝗼𝗸𝗲𝗱.
Le problème se cachait dans sa fonction 𝗰𝗿𝗲𝗮𝘁𝗲𝗖𝗼𝗻𝘁𝗲𝘅𝘁 :
𝗹𝗲𝘁 𝗰𝗼𝗻𝘁𝗲𝘅𝘁 = 𝗢𝗯𝗷𝗲𝗰𝘁.𝗰𝗿𝗲𝗮𝘁𝗲(𝘁𝗵𝗶𝘀.𝗮𝗰𝘁𝗶𝘃𝗲 ? 𝘁𝗵𝗶𝘀.𝗮𝗰𝘁𝗶𝘃𝗲 : 𝗢𝗯𝗷𝗲𝗰𝘁.𝗽𝗿𝗼𝘁𝗼𝘁𝘆𝗽𝗲);
L'erreur ?
À chaque nouvel appel, 𝘁𝗵𝗶𝘀.𝗮𝗰𝘁𝗶𝘃𝗲 n'était pas correctement nettoyé, créant ainsi un context qui pointait vers l'ancien.
Une fuite de mémoire classique mais sournoise, qui accumulait des références sans jamais les libérer.
Je décide de remplacer cette bibliothèque externe par l'API native de Node.js 𝗻𝗼𝗱𝗲:𝗮𝘀𝘆𝗻𝗰_𝗵𝗼𝗼𝗸𝘀.
Résultat immédiat : fuite de mémoire éliminée, application plus rapide et plus stable.
💡 Question pour vous:
quelle a été votre expérience de debugging la plus mémorable ?
Partagez vos histoires en commentaire !
P.S: Toi aussi tu aimes trier les biper? 😅