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/