javascript - Pronađi curenje memorije u Node.js/Express.js aplikaciji


Imam web aplikaciju u Express.js koja se stalno ruši zbog problema s memorijom:

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

Kada pokrenem servis, korištenje memorije je oko 170Mb (prema htop-u kao RES memorija). Zatim počnem slati zahtjeve, i memorija počne rasti. Koristim memwatch kako bih pokušao pratiti problem u onome što izgleda kao curenje memorije, ali memwatch.HeapDiff() izvještava nešto poput:

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

... gdje razumijem da aplikacija koristi 221,34 MB za heap; ali s htop korištenje memorije je oko 2 GB kada se sruši.

Pitanje je, ako su moje pretpostavke točne, što bi moglo koristiti memoriju izvan heap-a koja se ipak prikazuje u htop-u kao RES memorija?

Odgovor #1

Ovo sam već vidio, gdje je memorija prikazana kao korištena bila mnogo manja nego memorija koju prikazuje htop.

U našem slučaju radilo se o curenju memorije u JavaScriptu koje je izgledalo malo, ali kada je popravljeno riješilo je problem s memorijom.

Napisao sam objavu u kojoj detaljno opisujem korake koje sam poduzeo da to dijagnosticiram, predugo je da bih to ovdje objavio.

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