javascript - Hitta minnesläcka i Node.js/Express.js-applikation
Jag har en Express.js webbapp som ständigt kraschar på grund av minnesproblem:
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap
out of memory
När jag startar tjänsten är minnesanvändningen cirka 170 Mb (rapporteras av htop som RES-minne). Sedan börjar jag skicka förfrågningar till den, och minnet börjar öka. Jag använder memwatch för att försöka spåra problemet som ser ut som ett minnesläckage, men en memwatch.HeapDiff() rapporterar något i stil med:
{ before: { nodes: 2093729, size_bytes: 197165296, size: '188.03 mb' },
after: { nodes: 2491264, size_bytes: 232097040, size: '221.34 mb' },
...
... där jag förstår att appen använder 221,34 MB för heapen; men med htop är minnesanvändningen omkring 2 GB när den kraschar.
Frågan är, om mina antaganden är rätt, vad skulle kunna använda icke-heapminne som fortfarande rapporteras av htop som RES-minne?
Svar #1
Jag har sett detta tidigare, där minne som rapporterades som använt var mycket mindre än minnet som sågs av htop.
I vårt fall var det en minnesläcka i JavaScript som såg liten ut, men när den åtgärdades löstes minnesproblemet.
Jag skrev ett inlägg som beskriver stegen jag tog för att diagnostisera det, det är för långt för att posta här.
https://techtldr.com/simple-guide-to-finding-a-javascript-memory-leak-in-node-js/