Pitanja o upravljanju memorijom u Javi (+ odgovori)

Ovaj je članak dio serije: • Pitanja za intervju za Java Collections

• Pitanja o intervjuu za sustav tipa Java

• Pitanja za intervju s Java-om (+ odgovori)

• Struktura Java razreda i pitanja za intervju za inicijalizaciju

• Java 8 pitanja za intervju (+ odgovori)

• Upravljanje memorijom u Java intervjuu Pitanja (+ odgovori) (trenutni članak) • Java Generics intervju pitanja (+ odgovori)

• Pitanja za intervju s Java Flow Control (+ odgovori)

• Pitanja o intervjuu za iznimke Java (+ odgovori)

• Pitanja za intervju s Java Annotations (+ odgovori)

• Najpopularnija pitanja za proljetni okvirni intervju

1. Uvod

U ovom ćemo članku istražiti neka pitanja o upravljanju memorijom koja se često pojavljuju tijekom intervjua za programere Java. Upravljanje memorijom područje je koje nije poznato toliko programerima.

Zapravo se programeri obično ne moraju izravno nositi s ovim konceptom - jer JVM brine o sitnim i sitnim detaljima. Ako nešto ozbiljno ne pođe po krivu, čak i iskusni programeri možda neće imati točne informacije o upravljanju memorijom nadohvat ruke.

S druge strane, ti su pojmovi zapravo vrlo rašireni u intervjuima - pa krenimo odmah.

2. Pitanja

Q1. Što znači izjava "Memorijom se upravlja na Javi"?

Memorija je ključni resurs koji aplikacija treba za učinkovito pokretanje, a kao i svaki resurs, oskudna je. Kao takvo, njegovo dodjeljivanje i razmještanje u i iz aplikacija ili različitih dijelova aplikacije zahtijeva mnogo pažnje i razmatranja.

Međutim, u Javi programer ne mora izričito dodijeliti i osloboditi memoriju - JVM i preciznije Sakupljač smeća - ima dužnost rukovati dodjelom memorije tako da programer to ne mora.

To je suprotno onome što se događa u jezicima poput C gdje programer ima izravan pristup memoriji i doslovno referencira memorijske stanice u svom kodu, stvarajući puno prostora za curenje memorije.

Q2. Što je odvoz smeća i koje su njegove prednosti?

Skupljanje smeća postupak je pregledavanja memorije hrpe, identificiranja koji se objekti koriste, a koji ne i brisanja neiskorištenih objekata.

Objekt u upotrebi ili referencirani objekt znači da neki dio vašeg programa i dalje održava pokazivač na taj objekt. Nijedan dio vašeg programa više ne upućuje na nekorišteni objekt ili objekt bez reference. Tako se memorija koju koristi nereferencirani objekt može povratiti.

Najveća prednost odvoza smeća je u tome što s nas uklanja teret ručnog dodjeljivanja / uklanjanja memorije kako bismo se mogli usredotočiti na rješavanje problema koji je u pitanju.

Q3. Postoje li nedostaci u odvozu smeća?

Da. Kad god se sakupljač smeća pokrene, to utječe na izvedbu aplikacije. To je zato što se sve ostale niti u aplikaciji moraju zaustaviti kako bi nit sakupljača smeća učinkovito radio svoj posao.

Ovisno o zahtjevima aplikacije, to može biti stvarni problem koji je klijent neprihvatljiv. Međutim, ovaj se problem može znatno smanjiti ili čak eliminirati vještom optimizacijom i podešavanjem sakupljača smeća te upotrebom različitih GC algoritama.

Q4. Koje je značenje izraza “Stop-The-World”?

Kada je nit sakupljača smeća zaustavljen, zaustavljaju se druge niti, što znači da se aplikacija trenutno zaustavlja. To je analogno čišćenju ili fumigaciji kuća gdje se stanarima zabranjuje pristup dok postupak ne završi.

Ovisno o potrebama aplikacije, odvoz smeća "zaustavi svijet" može prouzročiti neprihvatljivo smrzavanje. Zbog toga je važno napraviti podešavanje sakupljača smeća i JVM optimizaciju kako bi zamrznuto stanje bilo barem prihvatljivo.

P5. Što su stog i hrpa? Što je pohranjeno u svakoj od ovih memorijskih struktura i kako su međusobno povezane?

Stog je dio memorije koji sadrži informacije o ugniježđenim pozivima metoda do trenutne pozicije u programu. Također sadrži sve lokalne varijable i reference na objekte na hrpi definirane u trenutno izvršnim metodama.

Ova struktura omogućuje runtime da se vrati iz metode znajući adresu odakle je pozvana, kao i da izbriše sve lokalne varijable nakon izlaska iz metode. Svaka nit ima svoj stog.

Hrpa je velika većina memorije namijenjena alokaciji objekata. Kada stvarate objekt pomoću novi Ključna riječ dodjeljuje se na hrpu. Međutim, referenca na ovaj objekt živi na stogu.

P6. Što je generacijsko prikupljanje smeća i što ga čini popularnim pristupom odvozu smeća?

Generacijsko sakupljanje smeća može se slobodno definirati kao strategiju koju koristi sakupljač smeća, gdje je gomila podijeljena u niz odjeljaka koji se nazivaju generacije, od kojih će svaki na hrpi držati predmete prema njihovoj "starosti".

Kad god se radi sakupljač smeća, prvi korak u procesu naziva se označavanje. Tu sakupljač smeća utvrđuje koji se dijelovi memorije koriste, a koji ne. To može biti vrlo dugotrajan postupak ako se svi objekti u sustavu moraju skenirati.

Kako se dodjeljuje sve više i više predmeta, popis objekata raste i raste što dovodi do sve duljeg vremena odvoza smeća. Međutim, empirijska analiza aplikacija pokazala je da je većina predmeta kratkotrajna.

S generacijskim odvozom smeća, predmeti se grupiraju prema njihovoj "starosti" u smislu broja ciklusa odvoza smeća koji su preživjeli. Na taj se način glavnina posla proširila na razne manje i veće cikluse sakupljanja.

Danas su gotovo svi sakupljači smeća generacijski. Ova je strategija toliko popularna jer se s vremenom pokazala kao optimalno rješenje.

P7. Detaljno opišite kako funkcionira generacijsko sakupljanje smeća

Da biste pravilno razumjeli kako generacijsko odvoz smeća, važno je prvo sjetite se kako je strukturirana Java hrpa kako bi se olakšalo generacijsko prikupljanje smeća.

Hrpa je podijeljena na manje prostore ili generacije. Ti su prostori mlada generacija, stara ili starosna generacija i trajna generacija.

The mlada generacija ugošćuje većinu novostvorenih objekata. Empirijska studija većine aplikacija pokazuje da je većina predmeta brzo kratkoga vijeka i stoga uskoro postaje podobna za prikupljanje. Stoga novi predmeti započinju svoje putovanje ovdje i tek se "promoviraju" u prostor stare generacije nakon što postignu određenu "dob".

Uvjet "dob" u generacijskom odvozu smeća odnosi se na broj ciklusa sakupljanja koje je objekt preživio.

Prostor mlade generacije dalje je podijeljen na tri prostora: prostor Edena i dva preživjela prostora poput Survivor 1 (s1) i Survivor 2 (s2).

The stara generacija ugošćuje objekte kojiživjeli u sjećanju duže od određene "dobi". Predmeti koji su preživjeli odvoz smeća od mlade generacije promoviraju se na ovaj prostor. Općenito je veći od mlade generacije. Budući da je veće veličine, odvoz smeća je skuplji i rjeđe se javlja nego u mladoj generaciji.

The trajna generacijaili češće zvani, PermGen, sadrži metapodatke koje zahtijeva JVM za opis klasa i metoda korištenih u aplikaciji. Sadrži i spremište nizova za pohranu interniranih nizova. Naseljava ga JVM tijekom izvođenja na temelju klasa koje aplikacija koristi. Uz to, ovdje mogu biti pohranjeni razredi i metode biblioteke platforme.

Prvi, svi novi objekti dodjeljuju se prostoru Eden. Oba prostora za preživjele počinju prazna. Kad se prostor Edena napuni, pokreće se manje odvoz smeća. Predmeti na koje se referira premještaju se u prvi preživjeli prostor. Nereferencirani objekti se brišu.

Tijekom sljedećeg manjeg GC, ista se stvar događa s prostorom Eden. Nereferencirani objekti se brišu, a referencirani se objekti premještaju u prostor za preživjele. Međutim, u ovom su slučaju premješteni u drugi preživjeli prostor (S2).

Uz to, objektima iz posljednjeg manjeg GC-a u prvom preživjelom prostoru (S1) povećava se starost i premještaju se u S2. Jednom kada su svi preživjeli objekti premješteni na S2, oslobađaju se i prostor S1 i Eden. U ovom trenutku S2 sadrži predmete različite dobi.

Na sljedećem manjem GC ponavlja se isti postupak. Međutim, ovaj put se mjesta za preživjele prebacuju. Predmeti na koje se referira premještaju se u S1 s Edena i S2. Preživjeli objekti su ostarjeli. Eden i S2 su očišćeni.

Nakon svakog manjeg ciklusa odvoza smeća provjerava se starost svakog predmeta. Oni koji su dosegli određenu proizvoljnu dob, na primjer 8 godina, promiču se iz mlade generacije u staru ili starije generacije. Za sve naredne manje GC cikluse, objekti će se i dalje promovirati u prostor stare generacije.

To prilično iscrpljuje proces odvoza smeća u mladoj generaciji. Na kraju će se izvršiti veliko odvoz smeća na staroj generaciji koja taj prostor očisti i zbije. Za svaki glavni GC postoji nekoliko manjih GC.

P8. Kada predmet postane podoban za odvoz smeća? Opišite kako Gc prikuplja prihvatljivi objekt?

Objekt postaje prihvatljiv za prikupljanje smeća ili GC ako nije dostupan iz niti niti ili putem statičkih referenci.

Najjednostavniji slučaj da objekt postane prihvatljiv za odvoz smeća je ako su sve njegove reference ništavne. Ciklične ovisnosti bez bilo kakve vanjske reference uživo također također ispunjavaju uvjete za GC. Dakle, ako objekt A referencira objekt B i objekt B referencira objekt A i nemaju drugu aktivnu referencu, tada će objekti A i B biti prihvatljivi za prikupljanje smeća.

Drugi je očit slučaj kada je nadređeni objekt postavljen na nulu. Kada se kuhinjski predmet interno odnosi na objekt hladnjaka i umivaonik, a kuhinjski objekt postavi na nulu, i hladnjak i sudoper postat će prihvatljivi za odvoz smeća zajedno s roditeljskom kuhinjom.

P9. Kako pokrećete prikupljanje smeća s Java koda?

Vi, kao programer Java, ne možete prisiliti odvoz smeća u Javi; pokrenut će se samo ako JVM misli da mu je potrebno prikupljanje smeća na temelju veličine hrpe Java.

Prije uklanjanja objekta iz memorije nit za sakupljanje smeća poziva metodu finalize () tog objekta i daje mogućnost izvođenja bilo kakvog čišćenja. Također se možete pozvati na ovu metodu objektnog koda, međutim, ne postoji jamstvo da će doći do odvoza smeća kada pozovete ovu metodu.

Pored toga, postoje metode poput System.gc () i Runtime.gc () koja se koristi za slanje zahtjeva za odvoz smeća JVM-u, ali nije zajamčeno da će se odvoz smeća dogoditi.

Q10. Što se događa kad nema dovoljno prostora za hrpu za smještaj novih predmeta?

Ako u Heap-u nema memorijskog prostora za stvaranje novog objekta, Java Virtual Machine baca OutOfMemoryError ili konkretnijejava.lang.OutOfMemoryError hrpa prostora.

Q11. Je li moguće «uskrsnuti» objekt koji je postao podoban za odvoz smeća?

Kada objekt postane prihvatljiv za odvoz smeća, GC mora pokrenuti dovršiti metoda na njemu. The dovršiti Zajamčeno je da će se metoda izvoditi samo jednom, stoga GC označava objekt kao dovršen i daje mu odmor do sljedećeg ciklusa.

U dovršiti metodom možete tehnički "uskrsnuti" objekt, na primjer, dodijelivši ga a statički polje. Predmet bi ponovno postao živ i bio neprikladan za odvoz smeća, pa ga GC ne bi sakupljao tijekom sljedećeg ciklusa.

Međutim, objekt bi bio označen kao dovršen, pa kad bi ponovno postao prihvatljiv, metoda finalizacije ne bi bila pozvana. U osnovi, ovaj trik "uskrsnuća" možete okrenuti samo jednom za života predmeta. Pripazite da ovaj ružni hack treba koristiti samo ako stvarno znate što radite - međutim, razumijevanje ovog trika daje neki uvid u to kako GC funkcionira.

Q12. Opišite jake, slabe, meke i fantomske reference i njihovu ulogu u sakupljanju smeća.

Kao što se memorijom upravlja u Javi, inženjer će možda trebati izvršiti što je moguće više optimizacije kako bi umanjio kašnjenje i povećao protok u kritičnim aplikacijama. Više nemoguće je izričito kontrolirati kada se pokreće odvoz smeća u JVM-u, moguće je utjecati na to kako se događa u odnosu na predmete koje smo stvorili.

Java nam pruža referentne objekte za kontrolu odnosa između objekata koje stvaramo i sakupljača smeća.

Prema zadanim postavkama, svaki objekt koji stvorimo u Java programu snažno se odnosi na varijablu:

StringBuilder sb = novi StringBuilder ();

U gornjem isječku, novi ključna riječ stvara novi StringBuilder objekt i spremi ga na hrpu. Varijabla sb zatim pohranjuje a jaka referenca ovom objektu. Što ovo znači za sakupljač smeća, to je posebno StringBuilder objekt uopće ne ispunjava uvjete za prikupljanje zbog snažnog pozivanja na njega sb. Priča se mijenja samo kad poništimo sb kao ovo:

sb = nula;

Nakon pozivanja gornjeg retka, objekt će tada ispunjavati uvjete za prikupljanje.

Taj odnos između objekta i sakupljača smeća možemo promijeniti eksplicitnim umotavanjem u drugi referentni objekt koji se nalazi unutra java.lang.ref paket.

A meka referenca može se stvoriti za gornji objekt ovako:

StringBuilder sb = novi StringBuilder (); SoftReference sbRef = novi SoftReference (sb); sb = nula;

U gornjem isječku stvorili smo dvije reference na StringBuilder objekt. Prvi redak stvara a jaka referencasb a drugi redak stvara a meka referencasbRef. Treći redak trebao bi objekt učiniti prihvatljivim za prikupljanje, ali će skupljač smeća odgoditi njegovo prikupljanje zbog sbRef.

Priča će se promijeniti tek kad se sjećanje stegne i JVM bude na rubu bacanja Bez memorije pogreška. Drugim riječima, objekti sa samo soft referencama prikupljaju se kao krajnje sredstvo za oporavak memorije.

A slaba referenca mogu se stvoriti na sličan način pomoću Slaba referenca razred. Kada sb je postavljeno na nulu i StringBuilder objekt ima samo slabu referencu, JVM-ov sakupljač smeća neće imati apsolutno nikakav kompromis i odmah će sakupiti objekt u sljedećem ciklusu.

A fantomska referenca sličan je slaboj referenci i objekt sa samo fantomskim referencama prikupit će se bez čekanja. Međutim, fantomske reference stavljaju se u red čim se prikupe njihovi predmeti. Možemo anketirati referentni red da bismo točno znali kada je objekt prikupljen.

Q13. Pretpostavimo da imamo kružnu referencu (dva predmeta koji se međusobno upućuju). Može li takav par predmeta postati podoban za odvoz smeća i zašto?

Da, par predmeta s kružnom referencom može postati prihvatljiv za odvoz smeća. To je zbog načina na koji Java-ov sakupljač smeća obrađuje kružne reference. Razmatra objekte uživo ne kada se na njih ikako referiraju, već kada su dostupni kretanjem grafom predmeta počevši od nekog korijena za sakupljanje smeća (lokalna varijabla žive niti ili statičkog polja). Ako par predmeta s kružnom referencom nije dostupan iz bilo kojeg korijena, smatra se podobnim za odvoz smeća.

P14. Kako su žice predstavljene u sjećanju?

A Niz Primjer u Javi je objekt s dva polja: a char [] vrijednost polje i an int hash polje. The vrijednost polje je niz znakova koji predstavljaju sam niz, a hash polje sadrži hashCode niza koji je inicijaliziran nulom, izračunato tijekom prvog hashCode () poziv i od tada u predmemoriju. Kao neobičan rubni slučaj, ako a hashCode niza ima nultu vrijednost, mora se ponovno izračunati svaki put kad hashCode () Zove se.

Važno je da a Niz instanca je nepromjenjiva: ne možete dobiti ili izmijeniti temeljnu char [] niz. Još jedna značajka nizova je da se statički konstantni nizovi učitavaju i predmemoriraju u spremištu nizova. Ako imate više identičnih Niz objekti u vašem izvornom kodu, svi su predstavljeni jednom instancom u vrijeme izvođenja.

P15. Što je Stringbuilder i koji su njegovi slučajevi upotrebe? Koja je razlika između dodavanja niza u Stringbuilder i spajanja dviju žica pomoću operatora +? Kako se Stringbuilder razlikuje od Stringbuffer-a?

StringBuilder omogućuje manipulaciju sljedovima znakova dodavanjem, brisanjem i umetanjem znakova i nizova. Ovo je promjenjiva struktura podataka, za razliku od Niz klasa koja je nepromjenjiva.

Prilikom spajanja dva Niz instanci, kreira se novi objekt i kopiraju nizovi. To bi moglo donijeti ogroman skupljač smeća ako trebamo stvoriti ili izmijeniti niz u petlji. StringBuilder omogućuje mnogo učinkovitije rukovanje manipulacijama nizovima.

StringBuffer se razlikuje od StringBuilder po tome što je zaštićen nitima. Ako trebate manipulirati nizom u jednoj niti, upotrijebite StringBuilder umjesto toga.

3. Zaključak

U ovom smo članku pokrili neka od najčešćih pitanja koja se često pojavljuju u intervjuima za inženjere Java. Pitanja o upravljanju memorijom uglavnom se postavljaju kandidatima za starije programere Java, jer anketar očekuje da ste izradili netrivijalne programe koji su često mučeni s problemima memorije.

To se ne bi trebalo tretirati kao iscrpan popis pitanja, već kao polazište za daljnja istraživanja. Mi iz tvrtke Baeldung želimo vam uspjeh u svim nadolazećim intervjuima.

Sljedeći » Pitanja o intervjuu za Java Generics (+ odgovori) « Prethodna pitanja o intervjuu za Java 8 (+ odgovori)