U Javi, upravljanje memorijom je proces dodjele i de-alokacije objekata, koji se naziva upravljanje memorijom. Java upravlja memorijom automatski. Java koristi sustav za automatsko upravljanje memorijom koji se zove a sakupljač smeća . Dakle, od nas se ne traži implementacija logike upravljanja memorijom u našoj aplikaciji. Java upravljanje memorijom dijeli se na dva glavna dijela:
Struktura JVM memorije
JVM stvara različita područja podataka vremena izvođenja u gomili. Ova područja se koriste tijekom izvođenja programa. Memorijska područja se uništavaju kada JVM izađe, dok se podatkovna područja uništavaju kada nit izađe.
Područje metode
Područje metode dio je heap memorije koji se dijeli između svih niti. Stvara se kada se JVM pokrene. Koristi se za pohranu strukture klase, naziva superklase, naziva sučelja i konstruktora. JVM pohranjuje sljedeće vrste informacija u području metode:
- Potpuno kvalificirano ime vrste (npr. String)
- Modifikatori tipa
- Ime izravne superklase tipa
- Strukturirani popis potpuno kvalificiranih naziva super sučelja.
Područje gomile
Heap pohranjuje stvarne objekte. Stvara se kada se JVM pokrene. Korisnik može kontrolirati hrpu ako je potrebno. Može biti fiksne ili dinamičke veličine. Kada koristite novu ključnu riječ, JVM stvara instancu za objekt u gomili. Dok se referenca tog objekta pohranjuje u stog. Postoji samo jedna hrpa za svaki pokrenuti JVM proces. Kad se gomila napuni, smeće se skuplja. Na primjer:
StringBuilder sb= new StringBuilder();
Gornja izjava stvara objekt klase StringBuilder. Objekt alocira hrpi, a referenca sb alocira hrpi. Heap je podijeljen na sljedeće dijelove:
- Mlada generacija
- Prostor za preživjele
- Stara generacija
- Stalna generacija
- Predmemorija koda
Vrsta reference
Postoje četiri vrste referenci: Jaka , Slab , Meko , i Fantomska referenca . Razlika među vrstama referenci je u tome što su objekti na gomili na koje se odnose podobni za skupljanje smeća prema različitim kriterijima.
Jaka referenca: Vrlo je jednostavan jer ga koristimo u svakodnevnom programiranju. Svaki objekt koji ima snažnu referencu pridruženu nije prikladan za skupljanje smeća. Možemo stvoriti jaku referencu korištenjem sljedeće izjave:
StringBuilder sb= new StringBuilder();
Slaba referenca: Ne preživi nakon sljedećeg procesa skupljanja smeća. Ako nismo sigurni kada će podaci biti ponovno zatraženi. U ovom stanju, možemo stvoriti slabu referencu na njega. U slučaju, ako skupljač otpada obrađuje, uništava objekt. Kada ponovno pokušamo dohvatiti taj objekt, dobivamo nultu vrijednost. Definirano je u java.lang.ref.WeakReference razreda. Slabu referencu možemo stvoriti pomoću sljedeće izjave:
WeakReference reference = new WeakReference(new StringBuilder());
Meka referenca: Prikuplja se kada aplikaciji ponestaje memorije. Skupljač smeća ne skuplja teško dostupne predmete. Svi meki referencirani objekti prikupljaju se prije nego izbaci OutOfMemoryError. Možemo stvoriti meku referencu pomoću sljedeće izjave:
SoftReference reference = new SoftReference(new StringBuilder());
Fantomska referenca: Dostupno je u java.lang.ref paket. Definirano je u java.lang.ref.PhantomReference razreda. Objekt koji ima samo fantomsku referencu koja na njih upućuje može se prikupiti kad god skupljač smeća želi prikupiti. Možemo stvoriti fantomsku referencu pomoću sljedeće izjave:
PhantomReference reference = new PhantomReference(new StringBuilder());
Područje snopa
Stack Area generira kada se stvori nit. Može biti fiksne ili dinamičke veličine. Memorija steka se dodjeljuje po niti. Služi za pohranu podataka i djelomičnih rezultata. Sadrži reference na heap objekte. Također sadrži samu vrijednost umjesto reference na objekt iz hrpe. Varijable koje su pohranjene u stogu imaju određenu vidljivost, koja se naziva opseg.
Okvir snopa: Okvir stoga je podatkovna struktura koja sadrži podatke niti. Podaci niti predstavljaju stanje niti u trenutnoj metodi.
- Koristi se za pohranjivanje djelomičnih rezultata i podataka. Također izvodi dinamičko povezivanje, vraćanje vrijednosti po metodama i iznimke otpreme.
- Kada se metoda pozove, stvara se novi okvir. Uništava okvir kada dovrši pozivanje metode.
- Svaki okvir sadrži vlastiti niz lokalnih varijabli (LVA), snop operanda (OS) i podatke okvira (FD).
- Veličine LVA, OS-a i FD-a određene tijekom kompajliranja.
- Samo je jedan okvir (okvir za izvršavanje metode) aktivan u bilo kojoj točki u datoj niti kontrole. Ovaj okvir se naziva trenutni okvir, a njegova metoda je poznata kao trenutna metoda. Klasa metode naziva se trenutna klasa.
- Okvir zaustavlja trenutnu metodu, ako njegova metoda pozove drugu metodu ili ako metoda završi.
- Okvir koji je stvorila nit je lokalan za tu nit i nijedna druga nit ne može ga referencirati.
Native Method Stack
Također je poznat kao C stack. To je hrpa izvornog koda napisanog na jeziku koji nije Java. Java Native Interface (JNI) poziva izvorni stog. Izvedba izvornog stoga ovisi o OS-u.
PC registri
Svaka nit ima registar programskog brojača (PC) povezan s njom. PC registar pohranjuje povratnu adresu ili izvorni pokazivač. Također sadrži adresu JVM instrukcija koje se trenutno izvode.
Rad skupljača smeća
Pregled skupljača smeća
Kada se program izvršava u Javi, on koristi memoriju na različite načine. Hrpa je dio memorije u kojem žive objekti. To je jedini dio memorije koji je uključen u proces skupljanja smeća. Također je poznato kao gomila smeća. Cjelokupno prikupljanje smeća osigurava da hrpa ima što više slobodnog prostora. Funkcija skupljača smeća je pronaći i izbrisati objekte do kojih se ne može doći.
Dodjela objekta
Kada objekt dodjeljuje, JRockit JVM provjerava veličinu objekta. Razlikuje male i velike predmete. Mala i velika veličina ovisi o JVM verziji, veličini hrpe, strategiji skupljanja smeća i korištenoj platformi. Veličina objekta obično je između 2 i 128 KB.
Mali objekti pohranjuju se u Thread Local Area (TLA) koji je slobodni dio hrpe. TLA se ne sinkronizira s drugim nitima. Kada se TLA napuni, traži se novi TLA.
S druge strane, veliki objekti koji ne stanu unutar TLA izravno su alocirani u gomilu. Ako nit koristi mladi prostor, izravno se pohranjuje u stari prostor. Veliki objekt zahtijeva veću sinkronizaciju između niti.
Što radi Java Garbage Collector?
JVM kontrolira sakupljač smeća. JVM odlučuje kada izvršiti sakupljanje smeća. Također možemo zatražiti od JVM-a da pokrene skupljač smeća. Ali nema jamstva ni pod kojim uvjetima da će se JVM pridržavati. JVM pokreće sakupljač smeća ako osjeti da ponestaje memorije. Kada Java program zatraži sakupljač smeća, JVM obično odobri zahtjev u kratkom roku. Ne osigurava prihvaćanje zahtjeva.
Ono što treba razumjeti je da ' kada objekt postaje podoban za odvoz smeća? '
Svaki Java program ima više od jedne niti. Svaka nit ima svoj izvršni stog. Postoji nit za pokretanje u Java programu koja je main() metoda. Sada možemo reći da je objekt prikladan za skupljanje smeća kada mu nijedna živa nit ne može pristupiti. Sakupljač smeća taj objekt smatra podobnim za brisanje. Ako program ima referentnu varijablu koja se odnosi na objekt, ta referentna varijabla dostupna živoj niti, ovaj se objekt naziva dohvatljiv .
pretvoriti string datum
Ovdje se postavlja pitanje da ' Može li Java aplikacija ostati bez memorije? '
Odgovor je da. Sustav skupljanja smeća pokušava ukloniti objekte iz memorije kada nisu u upotrebi. No, ako održavate mnogo živih objekata, sakupljanje smeća ne jamči da ima dovoljno memorije. Učinkovito će se upravljati samo dostupnom memorijom.
Vrste odvoza smeća
Postoji pet vrsta skupljanja smeća, a to su:
Algoritam označavanja i brisanja
JRockit JVM koristi algoritam označavanja i čišćenja za izvođenje skupljanja smeća. Sadrži dvije faze, fazu označavanja i fazu brisanja.
Označi fazu: Objekti koji su dostupni iz niti, izvornih ručica i drugih GC korijenskih izvora označeni su kao živi. Svako stablo objekata ima više od jednog korijenskog objekta. GC root je uvijek dostupan. Dakle, svaki objekt koji ima korijen skupljanja smeća u svom korijenu. Identificira i označava sve predmete koji su u uporabi, a preostali se mogu smatrati smećem.
Faza čišćenja: U ovoj fazi se prelazi hrpom kako bi se pronašao razmak između živih objekata. Te se praznine bilježe u slobodnoj listi i dostupne su za novu dodjelu objekata.
Postoje dvije poboljšane verzije označavanja i brisanja:
Istodobno označavanje i čišćenje
Omogućuje da niti nastave raditi tijekom velikog dijela skupljanja smeća. Postoje sljedeće vrste označavanja:
Paralelno označavanje i čišćenje
Koristi sav raspoloživ CPU u sustavu za što brže izvođenje skupljanja smeća. Također se naziva i paralelni sakupljač smeća. Niti se ne izvršavaju kada se izvodi paralelno sakupljanje smeća.
Prednosti Marka i Sweepa
- To je proces koji se ponavlja.
- To je beskonačna petlja.
- Nikakvi dodatni režijski troškovi nisu dopušteni tijekom izvođenja algoritma.
Nedostaci Marka i Sweepa
- Zaustavlja normalno izvršavanje programa dok radi algoritam za skupljanje smeća.
- Pokreće se više puta na programu.