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:
- Mlada generacija - tu se dodjeljuju i stare sve nove predmete. Kad se to napuni, dolazi do manjeg odvoza smeća
- 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
- 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:
- 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
- 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
- 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.
- 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:
Parametar | Stack memorija | Prostor hrpe |
---|---|---|
Primjena | Stog se koristi u dijelovima, jedan po jedan tijekom izvođenja niti | Cijela aplikacija koristi hrpu prostora tijekom izvođenja |
Veličina | Stog ima ograničenja veličine, ovisno o OS-u, i obično je manji od Heap-a | Ne postoji ograničenje veličine za Heap |
Skladištenje | Pohranjuje samo primitivne varijable i reference na objekte stvorene u prostoru gomile | Ovdje su pohranjeni svi novostvoreni objekti |
Narudžba | Pristupa 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. |
Život | Memorija snopa postoji samo dok je trenutna metoda pokrenuta | Prostor hrpe postoji sve dok aplikacija radi |
Učinkovitost | Razmjerno puno brže za dodjelu u usporedbi s hrpom | Sporije za dodjelu u usporedbi sa hrpom |
Dodjela / preraspodjela | Ova se memorija automatski dodjeljuje i oslobađa kada se metoda pozove i vrati | Prostor 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.