Složite memoriju i hrpu prostora u Javi

1. Uvod

Da bi pokrenuo aplikaciju na optimalan način, JVM dijeli memoriju na stog i hrpu memorije. Kad god deklariramo nove varijable i objekte, pozovimo novu metodu, proglasimo a Niz ili izvodi slične operacije, JVM određuje memoriju za te operacije iz memorije stoga ili prostora hrpe.

U ovom uputstvu razgovarat ćemo o ovim modelima memorije. Navest ćemo neke ključne razlike između njih, kako su pohranjene u RAM-u, značajke koje nude i gdje ih koristiti.

2. Složite memoriju u Javi

Stack Memory u Javi koristi se za statičku dodjelu memorije i izvršavanje niti. Sadrži primitivne vrijednosti specifične za metodu i reference na objekte koji se nalaze u hrpi, a upućuju se iz metode.

Pristup ovoj memoriji vrši se prema redoslijedu "Posljednji-prvi-izašao" (LIFO). Kad god se pozove nova metoda, kreira se novi blok na vrhu stoga koji sadrži vrijednosti specifične za tu metodu, poput primitivnih varijabli i referenci na objekte.

Kada metoda završi s izvršenjem, isprazni se odgovarajući okvir steka, tok se vraća na pozivnu metodu i prostor postaje dostupan za sljedeću metodu.

2.1. Ključne značajke memorije stoga

Osim onoga o čemu smo do sada razgovarali, slijede još neke značajke memorije stoga:

  • Raste i smanjuje se kako se pozivaju, tako i vraćaju nove metode
  • Varijable unutar stoga postoje samo dok je pokrenuta metoda koja ih je stvorila
  • Automatski se dodjeljuje i oslobađa kada metoda završi izvršenje
  • Ako je ova memorija puna, Java baca java.lang.StackOverFlowError
  • Pristup ovoj memoriji je brz u usporedbi s hrpom memorije
  • Ova memorija je sigurna u nitima jer svaka nit djeluje u vlastitom stogu

3. Prostor hrpe u Javi

Prostor hrpe u Javi koristi se za dinamičko dodjeljivanje memorije za Java objekte i JRE klase tijekom izvođenja. Novi se objekti uvijek stvaraju u prostoru hrpe, a reference na te objekte pohranjuju se u memoriju stoga.

Ti objekti imaju globalni pristup i može im se pristupiti s bilo kojeg mjesta u aplikaciji.

Ovaj se memorijski model dalje dijeli na manje dijelove koji se nazivaju generacije, a to su:

  1. Mlada generacija - tu se dodjeljuju i stare sve nove predmete. Kad se to napuni, dolazi do manjeg odvoza smeća
  2. Stara generacija ili stanarina - tu se čuvaju dugo preživjeli predmeti. Kada su objekti pohranjeni u mladoj generaciji, postavlja se prag za dob objekta i kada se taj prag dostigne, objekt se premješta u staru generaciju
  3. Trajna generacija - ovo se sastoji od JVM metapodataka za izvedbene klase i metode primjene

O ovim se različitim dijelovima govori i u ovom članku - Razlika između JVM, JRE i JDK.

Uvijek možemo manipulirati veličinom hrpe memorije prema našem zahtjevu. Za više informacija posjetite ovaj povezani članak Baeldung.

3.1. Ključne značajke Java Heap memorije

Osim onoga o čemu smo do sada razgovarali, slijede još neke značajke prostora hrpe:

  • Pristup mu je putem složenih tehnika upravljanja memorijom koje uključuju mladu generaciju, staru ili staru generaciju i trajnu generaciju
  • Ako je prostor hrpe pun, Java baca java.lang.OutOfMemoryError
  • Pristup ovoj memoriji relativno je sporiji od stog memorije
  • Ova se memorija, za razliku od stoga, ne uklanja automatski. Treba mu Garbage Collector da oslobodi neiskorištene predmete kako bi zadržao učinkovitost upotrebe memorije
  • Za razliku od stoga, hrpa nije sigurna u nitima i treba je čuvati pravilnom sinkronizacijom koda

4. Primjer

Na temelju onoga što smo do sada naučili, analizirajmo jednostavan Java kôd i procijenimo kako se ovdje upravlja memorijom:

razred Osoba {int id; Naziv niza; javna osoba (int id, naziv niza) {this.id = id; this.name = ime; }} javna klasa PersonBuilder {private static Person buildPerson (int id, String name) {return new Person (id, name); } javna statička void glavna (String [] args) {int id = 23; Ime niza = "Ivan"; Osoba osoba = null; osoba = buildPerson (id, ime); }}

Analizirajmo ovaj korak po korak:

  1. Po ulasku u glavni() metodom, stvorio bi se prostor u memoriji stoga za pohranu primitiva i referenci ove metode
    • Primitivna vrijednost cijelog broja iskaznica pohranit će se izravno u memoriju stoga
    • Referentna varijabla osoba tipa Osoba također će se stvoriti u memoriji stoga koja će ukazivati ​​na stvarni objekt u hrpi
  2. Poziv parametarskom konstruktoru Osoba (int, niz) iz glavni() dodijelit će daljnju memoriju na vrhu prethodnog stoga. Ovdje će se pohraniti:
    • The ovaj referenca objekta pozivajućeg objekta u memoriji stoga
    • Primitivna vrijednost iskaznica u memoriji stoga
    • Referentna varijabla od Niz argument Ime koji će ukazati na stvarni niz iz spremišta nizova u memoriji hrpe
  3. The glavni metoda dalje poziva buildPerson () statička metoda, za koju će se daljnje dodjeljivanje odvijati u memoriji stoga povrh prethodne. Ovo će opet pohraniti varijable na gore opisani način.
  4. Međutim, za novostvoreni objekt osoba tipa Osoba, sve varijable instance pohranit će se u hrpu memorije.

Ova alokacija objašnjena je na ovom dijagramu:

5. Sažetak

Prije nego što završimo ovaj članak, sažeti ćemo brzo razlike između memorije stoga i prostora hrpe:

ParametarStack memorijaProstor hrpe
PrimjenaStog se koristi u dijelovima, jedan po jedan tijekom izvođenja nitiCijela aplikacija koristi hrpu prostora tijekom izvođenja
VeličinaStog ima ograničenja veličine, ovisno o OS-u, i obično je manji od Heap-aNe postoji ograničenje veličine za Heap
SkladištenjePohranjuje samo primitivne varijable i reference na objekte stvorene u prostoru gomileOvdje su pohranjeni svi novostvoreni objekti
NarudžbaPristupa mu se pomoću sustava za dodjelu memorije Last-in First-out (LIFO)Ovoj se memoriji pristupa putem složenih tehnika upravljanja memorijom koje uključuju mladu generaciju, staru ili staru generaciju i trajnu generaciju.
ŽivotMemorija snopa postoji samo dok je trenutna metoda pokrenutaProstor hrpe postoji sve dok aplikacija radi
UčinkovitostRazmjerno puno brže za dodjelu u usporedbi s hrpomSporije za dodjelu u usporedbi sa hrpom
Dodjela / preraspodjelaOva se memorija automatski dodjeljuje i oslobađa kada se metoda pozove i vratiProstor gomile dodjeljuje se kada Gargabe Collector kreira nove objekte i oslobodi ih kada se na njih više ne upućuje

6. Zaključak

Stog i hrpa dva su načina na koja Java dodjeljuje memoriju. U ovom smo članku shvatili kako rade i kada ih koristiti za razvoj boljih Java programa.

Da biste saznali više o upravljanju memorijom na Javi, pogledajte ovaj članak ovdje. Također smo razgovarali o JVM Sakupljaču smeća o čemu je ukratko raspravljeno u ovom članku.