javascript - Nájdenie úniku pamäte v aplikácii Node.js/Express.js


Mám webovú aplikáciu v Express.js, ktorá sa neustále rozbíja kvôli problémom s pamäťou:

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap
out of memory

Keď spustím službu, využitie pamäte je približne 170 MB (hlásené htop ako RES pamäť). Potom na ňu začnem posielať požiadavky a pamäť začne rásť. Používam memwatch, aby som sa pokúsil sledovať problém, čo vyzerá ako únik pamäte, ale memwatch.HeapDiff() hlási niečo ako:

{ before: { nodes: 2093729, size_bytes: 197165296, size: '188.03 mb' },
  after: { nodes: 2491264, size_bytes: 232097040, size: '221.34 mb' },
  ...

... kde rozumiem tomu, že aplikácia používa 221,34 MB pre heap; ale s htop je využitie pamäte približne 2 GB, keď dôjde k zlyhaniu.

Otázka znie, ak sú moje predpoklady správne, čo by mohlo používať pamäť mimo heap, ktorá je stále hlásená htop ako RES pamäť?

Odpoveď č. 1

Už som to videl predtým, keď pamäť uvedená ako použitá bola oveľa menšia ako pamäť zobrazená v htop.

V našom prípade to bol únik pamäte v JavaScripte, ktorý vyzeral malý, ale keď bol opravený, vyriešil problém s pamäťou.

Napísal som príspevok, v ktorom som podrobne popísal kroky, ktoré som podnikol na jeho diagnostiku, je príliš dlhý na zverejnenie tu.

https://techtldr.com/simple-guide-to-finding-a-javascript-memory-leak-in-node-js/