logo

Upravljanje memorijom u Javi

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 Rad skupljača smeća

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.

Upravljanje memorijom u Javi

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:

    Serijski GC:Koristi pristup mark and sweeps za mlade i starije generacije, što je manji i veliki GC.Paralelni GC:Sličan je serijskom GC-u osim što stvara N (broj CPU jezgri u sustavu) niti za skupljanje smeća mlade generacije.Paralelni stari GC:Sličan je paralelnom GC-u, osim što koristi više niti za obje generacije.Sakupljač istodobnih oznaka (CMS):Odvozi smeće za stare generacije. Možete ograničiti broj niti u CMS kolektoru pomoću XX:ParalleCMSThreads=JVM opcija . Također je poznat kao Concurrent Low Pause Collector.G1 sakupljač smeća:Predstavljen je u Javi 7. Cilj mu je zamijeniti CMS kolektor. To je paralelni, konkurentni i CMS kolektor. Nema prostora za mlade i stare generacije. Dijeli hrpu u nekoliko hrpa jednake veličine. Prvo prikuplja regije s manje podataka uživo.

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.

Upravljanje memorijom u Javi

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 Paralelno označavanje i čišćenje

Istodobno označavanje i čišćenje

Omogućuje da niti nastave raditi tijekom velikog dijela skupljanja smeća. Postoje sljedeće vrste označavanja:

    Početno označavanje:Identificira korijenski skup živih objekata. To se radi dok su niti pauzirane.Istovremeno označavanje:U ovom označavanju slijedi referenca iz korijenskog skupa. Pronalazi i označava ostatak živih objekata na hrpi. To se radi dok nit radi.Oznaka prije čišćenja:Identificira promjene napravljene istodobnim označavanjem. Ostali živi objekti označeni i pronađeni. Radi se dok niti rade.Završno označavanje:Identificira promjene napravljene označavanjem prije čišćenja. Ostali živi objekti označeni i pronađeni. To se radi dok su niti pauzirane.

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.