logo

Stack vs Heap Java

În Java, gestionarea memoriei este un proces vital. Este gestionat automat de Java. JVM-ul împarte memoria în două părți: grămadă memorie și memorie heap. Din perspectiva Java, ambele sunt zone importante de memorie, dar ambele sunt folosite în scopuri diferite. The diferență majoră între memoria stivă și memoria heap este că stiva este folosită pentru a stoca ordinea de execuție a metodei și variabilele locale, în timp ce memoria heap stochează obiectele și folosește alocarea și dealocarea dinamică a memoriei. În această secțiune, vom discuta în detaliu diferențele dintre stivă și heap.

Stack vs Heap Java

Stack Memorie

Memoria stivei este un spațiu fizic (în RAM) alocat fiecărui fir în timpul rulării. Este creat atunci când se creează un fir. Gestionarea memoriei în stivă urmează ordinea LIFO (Last-In-First-Out) deoarece este accesibilă la nivel global. Stochează variabilele, referințele la obiecte și rezultatele parțiale. Memoria alocată stivei vieților până când funcția revine. Dacă nu există spațiu pentru crearea noilor obiecte, se aruncăjava.lang.StackOverFlowError. Sfera de aplicare a elementelor este limitată la firele lor. The JVM creează o stivă separată pentru fiecare fir.

Heap Memory

Este creat la pornirea JVM-ului și utilizat de aplicație atâta timp cât aplicația rulează. Stochează obiecte și clase JRE. Ori de câte ori creăm obiecte, acesta ocupă spațiu în memoria heap, în timp ce referința acelui obiect se creează în stivă. Nu urmează nicio ordine ca stiva. Se ocupă dinamic de blocurile de memorie. Înseamnă că nu trebuie să manipulăm manual memoria. Pentru gestionarea automată a memoriei, Java furnizează colectorul de gunoi care șterge obiectele care nu mai sunt utilizate. Memoria alocată heap-ului trăiește până când nu are loc niciun eveniment, fie program încheiat, fie memorie liberă. Elementele sunt accesibile la nivel global în aplicație. Este un spațiu de memorie comun partajat cu toate firele. Dacă spațiul heap este plin, se aruncăjava.lang.OutOfMemoryError. Memoria heap este împărțită în continuare în următoarele zone de memorie:

  • Generatia tanara
  • Spațiul supraviețuitorului
  • Vechea generatie
  • Generație permanentă
  • Cache de cod

Următoarea imagine arată alocarea memoriei stivei și a spațiului heap.

Stack vs Heap Java

Diferența dintre memoria stivă și memoria heap

Următorul tabel rezumă toate diferențele majore dintre memoria stivă și spațiul heap.

Parametru Stack Memorie Heap Space
Aplicație Stochează articole care au o viață foarte scurtă precum metode, variabile, și variabile de referință a obiectelor. Se stochează obiecte și Java Runtime Environment ( JRE ) clase.
Comanda Urmează LIFO Ordin. Nu urmează nicio ordine deoarece este o alocare de memorie dinamică și nu are niciun model fix pentru alocarea și dealocarea blocurilor de memorie.
Flexibilitate Este nu flexibil deoarece nu putem modifica memoria alocată. Este flexibil deoarece putem modifica memoria alocată.
Eficienţă Are Mai repede acces, alocare și dealocare. Are Mai lent acces, alocare și dealocare.
Capacitate de memorie Este mai mic in marime. Este mai mare in marime.
Opțiuni Java utilizate Putem crește dimensiunea stivei folosind opțiunea JVM -Xss. Putem crește sau micșora dimensiunea memoriei heap utilizând opțiunile - Xmx și -Xms JVM.
Vizibilitate sau Domeniu Variabilele sunt vizibile numai pentru firul proprietarului. Este vizibil pentru toate firele.
Generarea Spațiului Când este creat un fir de execuție, sistemul de operare alocă automat stiva. Pentru a crea spațiul heap pentru aplicație, limbajul apelează mai întâi sistemul de operare în timpul rulării.
Distributie Se creează o stivă separată pentru fiecare obiect. Este împărțit între toate firele.
Excepție aruncări JVM aruncă java.lang.StackOverFlowError dacă dimensiunea stivei este mai mare decât limita. Pentru a evita această eroare, măriți dimensiunea stivei. JVM aruncă java.lang.OutOfMemoryError dacă JVM-ul nu poate crea o nouă metodă nativă.
Alocare/Dealocare Se face automat de către compilator . Se face manual de către programator .
Cost Costul lui este Mai puțin . Costul lui este Mai mult în comparație cu stiva.
Implementarea Implementarea sa este greu . Implementarea sa este uşor .
Ordinea de alocare Alocarea memoriei este continuu . Memoria alocată în Aleatoriu Ordin.
Siguranța firelor Este sigur pentru fire deoarece fiecare fir are propriul său stivă. Nu este sigur pentru fire, așa că este necesară sincronizarea corectă a codului.