Správa pamäte v prostredí Java Interview Otázky (+ odpovede)

Tento článok je súčasťou série: • Otázky týkajúce sa rozhovorov o zbierkach Java

• Dotazy týkajúce sa systému typu Java

• Otázky týkajúce sa rozhovorov o súbehu Java (+ odpovede)

• Otázky týkajúce sa štruktúry triedy Java a inicializácie

• Otázky týkajúce sa rozhovoru s Java 8 (+ odpovede)

• Správa pamäte v otázkach rozhovoru Java (+ odpovede) (aktuálny článok) • Otázky rozhovoru Java Generics (+ odpovede)

• Otázky týkajúce sa riadenia toku Java (+ odpovede)

• Otázky týkajúce sa rozhovorov o výnimkách jazyka Java (+ odpovede)

• Dotazy k anotáciám Java (+ odpovede)

• Najlepšie otázky týkajúce sa jarného rámcového rozhovoru

1. Úvod

V tomto článku sa budeme venovať niektorým otázkam správy pamäte, ktoré sa často objavujú počas rozhovorov s vývojármi Java. Správa pamäte je oblasť, ktorú až tak veľa vývojárov nepozná.

V skutočnosti sa vývojári spravidla nemusia zaoberať týmto konceptom priamo - pretože JVM sa stará o drsné detaily. Pokiaľ sa niečo vážne nepokazí, ani ostrieľaní vývojári nemusia mať na dosah ruky presné informácie o správe pamäte.

Na druhej strane sú tieto pojmy v skutočnosti pri rozhovoroch dosť rozšírené - poďme teda na to.

2. Otázky

Q1. Čo znamená vyhlásenie „Pamäť je spravovaná v jazyku Java“?

Pamäť je kľúčovým zdrojom, ktorý aplikácia vyžaduje na efektívne fungovanie, a rovnako ako ktorýkoľvek iný zdroj, je ho nedostatok. Preto si jeho alokácia a pridelenie do az aplikácií alebo rôznych častí aplikácie vyžaduje veľkú starostlivosť a pozornosť.

Avšak v Jave nemusí vývojár výslovne prideľovať a prideľovať pamäť - JVM a konkrétnejšie Garbage Collector - má povinnosť narábať s alokáciou pamäte, aby to vývojár nemusel.

To je v rozpore s tým, čo sa deje v jazykoch ako C, kde má programátor priamy prístup k pamäti a doslova odkazuje na pamäťové bunky vo svojom kóde, čo vytvára veľa priestoru pre úniky pamäte.

Q2. Čo je zber odpadu a aké sú jeho výhody?

Zber odpadu je proces pozerania na haldu pamäte, identifikácie, ktoré objekty sa používajú a ktoré nie, a odstránenia nepoužívaných objektov.

Používaný objekt alebo odkazovaný objekt znamená, že niektorá časť vášho programu stále udržuje ukazovateľ na tento objekt. Na nepoužitý objekt alebo na neodkázaný objekt sa už neodkazuje žiadna časť vášho programu. Takže pamäť používaná nereferenčným objektom sa dá získať späť.

Najväčšou výhodou zberu odpadu je, že od nás odstraňuje bremeno ručného prideľovania / prideľovania pamäte, aby sme sa mohli sústrediť na riešenie daného problému.

Q3. Existujú nejaké nevýhody zberu odpadu?

Áno. Kedykoľvek je spustený program na odstraňovanie odpadu, má to vplyv na výkon aplikácie. Je to preto, lebo všetky ostatné vlákna v aplikácii musia byť zastavené, aby vlákno zberača odpadu mohlo efektívne vykonávať svoju prácu.

V závislosti od požiadaviek aplikácie to môže byť skutočný problém, ktorý je pre klienta neprijateľný. Tento problém sa však dá výrazne znížiť alebo dokonca eliminovať pomocou zručnej optimalizácie a vyladenia zberača odpadu a použitia rôznych algoritmov GC.

Q4. Aký je význam pojmu „Stop-The-World“?

Keď je vlákno zberača odpadu spustené, ostatné vlákna sú zastavené, čo znamená, že aplikácia je na chvíľu zastavená. Je to analogické s upratovaním alebo fumigáciou domov, kde je cestujúcim odopretý prístup, kým nie je proces dokončený.

V závislosti na potrebách aplikácie môže zhromažďovanie odpadu typu „zastaviť svet“ spôsobiť neprijateľné zmrazenie. To je dôvod, prečo je dôležité urobiť ladenie zberača odpadu a optimalizáciu JVM, aby bolo zmrazenie minimálne prijateľné.

Q5. Čo sú hromady a haldy? Čo je uložené v každej z týchto pamäťových štruktúr a ako spolu súvisia?

Zásobník je časť pamäte, ktorá obsahuje informácie o volaní vnorených metód do aktuálnej polohy v programe. Obsahuje tiež všetky lokálne premenné a odkazy na objekty na halde definované v súčasne vykonávajúcich metódach.

Táto štruktúra umožňuje modulu runtime návrat z metódy s vedomím adresy, odkiaľ sa volala, a tiež po ukončení metódy vymazať všetky miestne premenné. Každé vlákno má svoj vlastný zásobník.

Halda je veľká časť pamäte určenej na alokáciu objektov. Keď vytvárate objekt pomocou Nový kľúčové slovo, pridelí sa na halde. Odkaz na tento objekt však žije v zásobníku.

Q6. Čo je generačný zber odpadu a vďaka čomu je populárny prístup k zberu odpadu?

Generačný zber odpadu môžeme voľne definovať ako stratégiu, ktorú používa zberač odpadu, keď je halda rozdelená na niekoľko sekcií nazývaných generácie, pričom každá z nich bude na halde obsahovať objekty podľa svojho „veku“.

Kedykoľvek je zberač odpadu v prevádzke, prvý krok v procese sa nazýva označovanie. Toto je miesto, kde garbage collector identifikuje, ktoré časti pamäte sa používajú a ktoré nie. Môže to byť veľmi časovo náročný proces, ak musia byť skenované všetky objekty v systéme.

Ako je stále viac alokovaných objektov, zoznam objektov rastie a rastie, čo vedie k čoraz dlhšiemu času zbierania odpadu. Empirická analýza aplikácií však ukázala, že väčšina objektov je krátkodobých.

Pri generačnom zbere odpadu sú objekty zoskupené podľa ich „veku“ podľa toho, koľko cyklov zberu odpadu prežili. Týmto spôsobom sa prevažná časť práce rozšírila do rôznych menších a veľkých cyklov zberu.

Dnes sú takmer všetci smetiari generační. Táto stratégia je taká populárna, pretože sa časom ukázala ako optimálne riešenie.

Q7. Podrobne popíšte, ako funguje generačný zber odpadu

Aby ste správne pochopili, ako funguje generačný zber odpadu, je potrebné najskôr pamätajte, ako je halda Java štruktúrovaná uľahčiť generačný zber odpadu.

Hromada je rozdelená na menšie priestory alebo generácie. Jedná sa o mladú generáciu, starú alebo tenurovanú generáciu a permanentnú generáciu.

The mladá generácia hostí väčšinu novo vytvorených objektov. Empirická štúdia väčšiny aplikácií ukazuje, že väčšina objektov má krátku životnosť a preto sa čoskoro stanú spôsobilými na zber. Preto nové objekty začínajú svoju cestu sem a do priestoru starej generácie sú „povýšené“ až po dosiahnutí určitého „veku“.

Termín "Vek" pri generačnom zbere smetí odkazuje na počet cyklov zberu, ktoré objekt prežil.

Priestor mladej generácie sa ďalej delí na tri priestory: priestor Eden a dva priestory pre preživších, ako napríklad Survivor 1 (s1) a Survivor 2 (s2).

The stará generácia hostí objekty, ktoréžili v pamäti dlhšie ako určitý „vek“. Do tohto priestoru sú promované objekty, ktoré prežili zbieranie odpadkov z mladej generácie. Spravidla je väčší ako mladá generácia. Pretože je väčší, zber odpadu je nákladnejší a vyskytuje sa menej často ako v mladej generácii.

The permanentná generáciaalebo častejšie nazývané PermGen, obsahuje metadáta požadované JVM popísať triedy a metódy použité v aplikácii. Obsahuje tiež fond reťazcov na ukladanie interných reťazcov. Je vyplnená JVM za behu modulu na základe tried používaných aplikáciou. Ďalej tu môžu byť uložené triedy a metódy knižnice platformy.

Najprv, akékoľvek nové objekty sú pridelené do priestoru Eden. Oba priestory pre pozostalých začínajú prázdne. Keď sa priestor Eden zaplní, spustí sa zber malého odpadu. Odkazované objekty sa presunú do prvého priestoru prežitia. Neodkazované objekty sa odstránia.

Počas nasledujúcej menšej GC sa to isté stane s rajským priestorom. Nereferenčné objekty sa odstránia a odkazované objekty sa presunú do priestoru prežitia. V tomto prípade sa však presunú do druhého priestoru pre prežitie (S2).

Okrem toho majú objekty z poslednej menšej GC v priestore prvého prežitia (S1) zvýšený ich vek a sú presunuté do S2. Akonáhle sú všetky prežívajúce objekty presunuté na S2, priestor S1 a Eden sa vyčistí. V tomto okamihu obsahuje S2 objekty rôzneho veku.

Pri nasledujúcej menšej GC sa rovnaký postup opakuje. Tentoraz sa však priestor preživších prepne. Odkazované objekty sa presunú do S1 z Edenu aj z S2. Prežívajúce predmety starnú. Eden a S2 sú vyčistené.

Po každom cykle menšieho zberu odpadu sa kontroluje vek každého objektu. Tí, ktorí dosiahli určitý svojvoľný vek, napríklad 8 rokov, sú povýšení z mladej generácie na starú alebo udržiavanú generáciu. Vo všetkých nasledujúcich menších cykloch GC budú objekty naďalej propagované do priestoru starej generácie.

Týmto sa do veľkej miery vyčerpáva proces zberu odpadu v mladej generácii. Nakoniec sa uskutoční veľká zbierka odpadu u starej generácie, ktorá tento priestor vyčistí a zhutní. Pre každú hlavnú GC existuje niekoľko menších GC.

Q8. Kedy je objekt oprávnený na odvoz odpadu? Popíšte, ako GC zhromažďuje oprávnený predmet?

Objekt sa stáva oprávneným na Garbage Collection alebo GC, ak nie je dostupný zo žiadnych živých vlákien alebo zo statických odkazov.

Najpriamočiarejší prípad, keď sa objekt stane vhodným na zber odpadu, je ak sú všetky jeho referencie nulové. Cyklické závislosti bez akejkoľvek externej externej referencie sú tiež vhodné pre GC. Takže ak objekt A odkazuje na objekt B a objekt B odkazuje na objekt A a nemajú žiadny iný živý odkaz, budú oba objekty A aj B spôsobilé na zhromažďovanie odpadu.

Ďalším zrejmým prípadom je, keď je nadradený objekt nastavený na hodnotu null. Keď kuchynský objekt interne odkazuje na objekt chladničky a drez a kuchynský objekt je nastavený na hodnotu null, chladnička aj drez budú oprávnené na zber odpadu popri svojej nadradenej kuchyni.

Q9. Ako spúšťate zber odpadu z kódu Java?

Vy, ako programátor Java, nemôžete vynútiť odvoz odpadu v Jave; spustí sa, iba ak si JVM myslí, že potrebuje zber odpadkov založený na veľkosti haldy Java.

Pred odstránením objektu z pamäte vlákno na zhromažďovanie odpadu vyvolá metódu finalize () tohto objektu a dá príležitosť vykonať akýkoľvek požadovaný druh vyčistenia. Môžete tiež vyvolať túto metódu objektového kódu, avšak neexistuje záruka, že pri volaní tejto metódy dôjde k zberu odpadu.

Ďalej existujú metódy, ako je System.gc () a Runtime.gc (), ktoré sa používajú na odoslanie žiadosti o odvoz odpadu spoločnosti JVM, ale nie je zaručené, že sa bude zber odpadkov konať.

Q10. Čo sa stane, keď nie je dostatok haldy na uloženie nových predmetov?

Ak v halde nie je žiadny pamäťový priestor na vytvorenie nového objektu, hodí sa Java Virtual Machine OutOfMemoryError alebo konkrétnejšiejava.lang.OutOfMemoryError halda priestor.

Q11. Je možné «vzkriesiť» objekt, ktorý sa stal oprávneným na zber odpadu?

Keď sa objekt stane oprávneným na odvoz odpadu, GC musí spustiť dokončiť metóda na to. The dokončiť Táto metóda je zaručene spustená iba raz, takže GC označí objekt ako dokončený a dá mu pokoj do ďalšieho cyklu.

V dokončiť metódou môžete technicky „vzkriesiť“ objekt, napríklad jeho priradením k a statický lúka. Objekt by znova ožil a nespĺňal podmienky na odvoz odpadu, takže ho GC počas nasledujúceho cyklu nezbiera.

Objekt by však bol označený ako finalizovaný, takže keď sa znovu stane oprávneným, nebude sa finalizačná metóda volať. Tento trik „vzkriesenia“ môžete v podstate otočiť iba raz počas celej životnosti objektu. Upozorňujeme, že tento škaredý hack by sa mal používať, iba ak skutočne viete, čo robíte - pochopenie tohto triku však poskytuje určitý prehľad o tom, ako funguje GC.

Q12. Popíšte silné, slabé, jemné a fantómové referencie a ich úlohu v zbieraní odpadu.

Pokiaľ je pamäť spravovaná v prostredí Java, inžinier môže potrebovať vykonať čo najväčšiu optimalizáciu, aby minimalizoval latenciu a maximalizoval výkon v kritických aplikáciách. Veľa ako nie je možné výslovne riadiť, kedy je spustený zber odpadu v JVM, je možné ovplyvniť, ako k tomu dôjde, pokiaľ ide o objekty, ktoré sme vytvorili.

Java nám poskytuje referenčné objekty na kontrolu vzťahu medzi objektmi, ktoré vytvárame, a zberačom odpadu.

V predvolenom nastavení je každý objekt, ktorý vytvoríme v programe Java, silne odkazovaný na premennú:

StringBuilder sb = nový StringBuilder ();

Vo vyššie uvedenom úryvku sa nachádza ikona Nový kľúčové slovo vytvorí nové StringBuilder objekt a uloží ho na haldu. Premenná sb potom uloží a silná referencia k tomuto objektu. Čo to pre smetiara znamená, je to konkrétne StringBuilder objekt nie je vôbec vhodný na zhromažďovanie kvôli silnému odkazu, ktorý mu drží sb. Príbeh sa zmení, až keď anulujeme sb Páči sa ti to:

sb = null;

Po zavolaní na vyššie uvedený riadok bude objekt oprávnený na inkaso.

Tento vzťah medzi objektom a zberačom odpadu môžeme zmeniť tak, že ho explicitne zabalíme do iného referenčného objektu, ktorý sa nachádza vo vnútri java.lang.ref balíček.

A mäkký odkaz je možné vytvoriť k vyššie uvedenému objektu takto:

StringBuilder sb = nový StringBuilder (); SoftReference sbRef = nový SoftReference (sb); sb = null;

Vo vyššie uvedenom úryvku sme vytvorili dva odkazy na StringBuilder objekt. Prvý riadok vytvára a silná referenciasb a druhý riadok vytvára a mäkký odkazsbRef. Tretí riadok by mal umožniť, aby bol objekt vhodný na zber, ale zberač odpadu ho odloží kvôli sbRef.

Príbeh sa zmení, až keď sa pamäť stiahne a JVM je na pokraji hodu Nedostatok pamäte chyba. Inými slovami, objekty, ktoré majú iba mäkké odkazy, sa zhromažďujú ako posledná možnosť na obnovenie pamäte.

A slabá referencia možno vytvoriť podobným spôsobom pomocou Slabá referencia trieda. Kedy sb je nastavená na nulu a StringBuilder objekt má iba slabú referenciu, zberač odpadkov JVM nebude mať absolútne žiadny kompromis a objekt okamžite zhromaždí hneď v ďalšom cykle.

A fantómový odkaz je podobný slabému odkazu a objekt s iba fantómovými odkazmi bude zhromaždený bez čakania. Fantómové odkazy však zostanú v rade, akonáhle sa zhromaždia ich objekty. Môžeme dopytovať referenčný front, aby sme presne vedeli, kedy bol objekt zhromaždený.

Q13. Predpokladajme, že máme kruhový odkaz (dva objekty, ktoré sa navzájom odkazujú). Mohlo by sa také dvojice predmetov stať oprávnenými na odvoz odpadu a prečo?

Áno, dvojica objektov s kruhovým odkazom sa môže stať predmetom zberu odpadu. Je to tak kvôli tomu, ako systém Java na spracovanie odpadu narába s kruhovými odkazmi. Považuje objekty za živé nie vtedy, keď na ne majú nejaký odkaz, ale za dosiahnuteľný navigáciou v grafe objektov, ktorý vychádza z nejakého koreňa zberu odpadu (lokálna premenná živého vlákna alebo statické pole). Ak pár objektov s kruhovým odkazom nie je prístupný zo žiadneho koreňa, považuje sa to za vhodné na zhromažďovanie odpadkov.

Q14. Ako sú zastúpené struny v pamäti?

A String inštancia v Jave je objekt s dvoma poľami: a char [] hodnota pole a an int hash lúka. The hodnotu pole je pole znakov predstavujúce samotný reťazec a hash pole obsahuje hashCode reťazca, ktorý je inicializovaný nulou, vypočítanou počas prvej hashCode () volať a odvtedy ukladať do vyrovnávacej pamäte Ako kuriózny okrajový prípad, ak a hashCode reťazca má nulovú hodnotu, musí sa prepočítať zakaždým, keď hashCode () sa volá.

Dôležité je, že a String inštancia je nemenná: nemôžete získať ani upraviť podklad char [] pole. Ďalšou vlastnosťou reťazcov je to, že reťazce so statickou konštantou sa načítajú a ukladajú do medzipamäte v skupine reťazcov. Ak máte viac identických String objekty vo vašom zdrojovom kóde, všetky sú za behu reprezentované jednou inštanciou.

Q15. Čo je Stringbuilder a aké sú jeho prípady použitia? Aký je rozdiel medzi pripojením reťazca k tvorcovi reťazcov a spojením dvoch reťazcov s operátorom +? Ako sa líši Stringbuilder od Stringbuffer?

StringBuilder umožňuje manipuláciu so sekvenciami znakov pridávaním, mazaním a vkladaním znakov a reťazcov. Toto je premenlivá dátová štruktúra, na rozdiel od String triedy, ktorá je nemenná.

Pri zreťazení dvoch String inštanciách sa vytvorí nový objekt a skopírujú sa reťazce. To by mohlo priniesť obrovské náklady na zber odpadu, ak potrebujeme vytvoriť alebo upraviť reťazec v cykle. StringBuilder umožňuje oveľa efektívnejšie manipuláciu s reťazcami.

StringBuffer sa líši od StringBuilder v tom, že je bezpečný pre vlákna. Ak potrebujete manipulovať s reťazcom v jednom vlákne, použite StringBuilder namiesto toho.

3. Záver

V tomto článku sme sa venovali niektorým z najbežnejších otázok, ktoré sa často vyskytujú v rozhovoroch s inžiniermi Java. Otázky týkajúce sa správy pamäte sú väčšinou kladené na kandidátov na pozíciu Senior Java Developer, pretože anketár očakáva, že ste vytvorili netriviálne aplikácie, ktoré mnohokrát trápia problémy s pamäťou.

Toto by sa nemalo považovať za vyčerpávajúci zoznam otázok, ale skôr za odrazový mostík pre ďalší výskum. My v Baeldungu vám prajeme úspech v akýchkoľvek nadchádzajúcich rozhovoroch.

Ďalšie » Java Generics Interview Questions (+ Answers) « Predchádzajúce otázky na rozhovor s Java 8 (+ odpovede)

$config[zx-auto] not found$config[zx-overlay] not found