Middle
Hogyan működik a memória JavaScriptben?
sobes.tech MI
Válasz az MI-től
A JavaScript memória automatikusan van kezelve. Két fő területre oszlik:
- Heap (Heap): Itt tárolódnak az objektumok és függvények. A memória dinamikusan allokálódik az entitások létrehozásakor.
- Stack (Verem): Itt tárolódnak primitív értékek (karakterláncok, számok, boolean, null, undefined, Symbol, BigInt) és a heapben lévő objektumokra mutató hivatkozások. A verem a LIFO (Last-In, First-Out) elv szerint működik.
Amikor egy objektum hivatkozása már nem használatos, a garbage collector (szemétgyűjtő) felszabadítja a heapben a memóriát. A szemétgyűjtő algoritmusok változhatnak, de gyakran alkalmazzák a Mark and Sweep módszert:
- Jelölés: A szemétgyűjtő átvizsgálja az összes elérhető objektumot a gyökércsomópontokból (globális változók, a jelenlegi függvény helyi változói), és "élő"ként jelöli meg őket.
- Tisztítás: Minden nem jelölt (nem elérhető a gyökércsomópontokból) objektum "halott" és törlésre kerül a memóriából.
A szemétgyűjtő háttérben és automatikusan működik. Memória problémák, például szivárgások akkor fordulnak elő, amikor az objektumok elérhetőek maradnak, bár a program logikája szerint már nem használják őket.
A primitív értékek másolódnak érték szerint, míg az objektumok és tömbök referencia szerint.
// Példa: primitív érték másolódik érték szerint
let a = 5;
let b = a;
b = 10;
// az a továbbra is 5, a b 10 lesz
// Példa: objektum referencia szerint másolódik
let obj1 = { value: 10 };
let obj2 = obj1;
obj2.value = 20;
// az obj1.value mostantól szintén 20, mivel az obj2 ugyanarra az objektumra mutat