NodeJs(NestJs) memory leak


E grafana. Din nest doar se trimit date.

Aha. Dragut. Cam aceleasi grafice le ofera si Heroku sau PM2 Plus, doar ca astea 2 nu sunt self-hosted.

Ele sunt mai multe dar nu su intrat in poza. Mai mult de atat poti sa faci si ceva custom…
Vreau sa invat grafana si sa vad ce nai pot sa trimit si are logica.

Simple grafice cu evolutia cantitatii de memorie utilizate nu te ajuta prea mult.

Un exemplu de ce inseamna analiza de memorie, in alt limbaj. Arata clar ca la momentul t fusesera alocati in total 5.4 MiB: 2.9 MiB de cod de la linia cutare, etc.

  • sa reusesc sa masor cata memorie se consuma intr-o functie.

O functie nu consuma memorie, obiectele iti consuma memorie. In functie de ce instantiezi si cum o sa foloseasca memoria in mod diferit.

Cand dai ca si input la o functie un JSON, daca nu ii faci o copie noua cu Object.assign() sau spread atunci o sa foloseasca referinta la memorie. Deci in tot codul tau, marimea la json va fi marimea in memorie. Daca mai faci de exemplu referinte la noduri, tot aceeasi memorie o va folosi. Trebuie sa faci spread sau object.assign() ca sa aloce memorie dedicata.

Daca instantiezi o clasa fara sa verifici daca e deja instantiata, va crea mereu un obiect nou in memorie. (Nu exista clase reale in JS, sunt doar obiecte in spate)

Daca faci array-uri cu tipuri mixte iarasi in spate va tot copia dintr-un loc in memorie in altul si tine loc pentru fiecare cat pentru cel mai mare element din array la fiecare operatie. Daca faci array-uri cu goluri atunci si golurile vor lua tot atat spatiu ca si tipul array-ului. (deci degeaba faci un array gol de 1000 elemente daca ai un singur element cu ditamai obiectul in el)
Daca faci array-uri cu goluri si tipuri mixte o sa fie iarasi worst case scenario. Partea si mai funny e ca daca de exemplu ai un array de numere si introduci de exemplu null in el pe unele index-uri o sa ramana un array mixt mereu in memorie, la fel se intampla si daca introduci ceva obiect in array, dar il folosesti doar pentru string-uri in mod normal.

Unele functii, precum Array.map sau .Array.slice returneaza un nou obiect cu o noua referinta, deci memorie in plus. Unde ai map pe ceva obiect mare foloseste foreach sau un simplu for si foloseste variable, nu constante.

Programarea functionala consuma mult mai multa memorie daca nu apelezi la trucuri complexe, dar te salveaza de bug-uri si codul e mai usor de citit.

Ai nevoie de optics ca sa iti faci treaba in mod imutabil pe obiecte mari.

1 Like