În „Blogul anterior”, am înțeles gestionarea memoriei în Node.js, cum funcționează Garbage Collector (GC) și care sunt cauzele posibile ale pierderilor de memorie, în ciuda faptului că GC joacă un rol crucial. În acest blog, să ne uităm la cele mai bune practici pentru a asigura utilizarea eficientă a memoriei în Node.js.

REDUCEREA UTILIZĂRII VARIABILELOR GLOBALE

Deoarece variabilele globale nu sunt niciodată colectate de gunoi, cel mai bine este să vă asigurați că nu le folosiți excesiv.

În special în javascript, trebuie să țineți cont de anumite aspecte pentru a reduce variabilele globale

  1. Evitați globalizările accidentale

În Javascript, dacă atribuiți o valoare unei variabile nedeclarate, Javascript o ridică automat ca variabilă globală în modul implicit. De asemenea, acest lucru este valabil și cu cuvântul „acest” folosit în funcții în domeniul global.

Exemple:

function apple() {
	red = true; // this red variable gets hoisted in global space
}
function mango() {
// since 'this' in global functions refers to global this varible is hoisted in global space
this.type = "Alphanso";  
}

Soluție: este util să scrieți javascript într-un mod strict, cu adnotarea „utilizați strict” în partea de sus a fișierului JS. În versiunile mai noi de Node.js, puteți activa modul strict la nivel global, trecând marcajul „ — use_strict” atunci când rulați comanda node.

'use strict'
function apple() {
	red = true; // this will throw an error
}
function mango() {
// this function will have its own scope for 'this'
this.type = "Alphanso";  
}

Atenție: fiți atenți când utilizați funcții de săgeată, deoarece chiar și în modul strict, „acest” în funcția săgeată va fi în spațiul global

// This will also become a global variable as arrow functions
const plantation = () => {
    this.coconut = "Brown";
}

soluție: utilizați regula no-invalid-this de la ESLint pentru a evita astfel de cazuri.

Utilizați cu înțelepciune domeniul de aplicare global:

  • Pe cât posibil, nu utilizați domeniul global, folosiți cât mai bine domeniul local în interiorul funcțiilor, deoarece acesta va fi colectat de gunoi și va păstra memoria liberă.
  • Încercați să definiți numai constante, cache și variabile reutilizabile în global. Marcați variabilele ca nule ori de câte ori valorile nu sunt necesare.
  • Nu utilizați spațiul global ca mediu pentru a trece valori de la o funcție la alta, folosiți în schimb parametrii funcției.
  • Nu stocați obiecte mari în domeniul global. Dacă trebuie să le depozitați, anulați-le atunci când nu este nevoie. Nu lăsați obiectele din cache să crească la infinit, curățați o dată și în timp.

2. Utilizați în mod eficient memoria stivă

Accesarea stivei este mult mai rapidă decât accesarea memoriei heap, prin urmare încercați să utilizați variabilele stivei mai frecvent decât omologii lor. Acest lucru asigură, de asemenea, că nu provocăm accidental scurgeri de memorie. Desigur, într-un scenariu din lumea reală, este imposibil să creezi o aplicație utilizabilă folosind doar date statice. Dar putem urma câteva trucuri pentru a folosi mai bine stiva.

  1. Evitați referințele la obiecte heap din variabilele stivei atunci când este posibil. De asemenea, nu păstrați variabilele neutilizate.
  2. Destructurați și utilizați câmpurile necesare dintr-un obiect sau o matrice, mai degrabă decât să treceți în jurul obiectelor/matricelor întregi la funcții. Acest lucru evită păstrarea unei referințe la obiecte în interiorul închiderii.
function outer() {
    const obj = {
        foo: 1,
        bar: "hello",
    };
const closure = () {
        const { foo } = obj;
        myFunc(foo);
    }
}
function myFunc(foo) {}

3. Utilizați Heap Memory în mod eficient

În aplicațiile din lumea reală, este destul de imposibil să evitați complet utilizarea memoriei heap, dar o putem face mai eficientă urmând câteva sfaturi:

  1. copiați obiecte în loc să le faceți referințe. Treceți referința numai dacă obiectul este imens și operațiunea de copiere este costisitoare.
  2. Evitați pe cât posibil mutațiile de obiect, în schimb folosiți object spread sau object.assign și creați o copie.
  3. Evitați să creați mai multe referințe la același obiect
  4. Evitați să creați copaci de obiecte uriașe, altfel păstrați-i de scurtă durată

4. Fiți precauți când utilizați închideri, cronometre și gestionare evenimente

Pentru temporizatoare, nu uitați întotdeauna să transmiteți copii ale obiectelor pentru a evita mutațiile și ștergeți temporizatoarele atunci când utilizați metodele clearTimeout și clearInterval.

De asemenea, ascultătorii clari odată ce treaba este terminată, nu-i lăsați să ruleze pentru totdeauna. În cazurile în care se păstrează referință la obiect din domeniul părinte.

postat inițial la amodshinde.com