logo

Správa paměti v Javě

V Javě je správa paměti proces alokace a zrušení alokace objektů, nazývaný správa paměti. Java provádí správu paměti automaticky. Java používá automatický systém správy paměti nazývaný a Popelář . Nemusíme tedy v naší aplikaci implementovat logiku správy paměti. Správa paměti Java se dělí na dvě hlavní části:

dijkstra
    Struktura paměti JVM Práce sběrače odpadků

Struktura paměti JVM

JVM vytváří různé oblasti dat doby běhu v hromadě. Tyto oblasti se používají během provádění programu. Paměťové oblasti jsou zničeny při ukončení JVM, zatímco datové oblasti jsou zničeny při ukončení vlákna.

Správa paměti v Javě

Oblast metody

Method Area je část paměti haldy, která je sdílena všemi vlákny. Vytváří se při spuštění JVM. Používá se k uložení struktury třídy, názvu nadtřídy, názvu rozhraní a konstruktorů. JVM ukládá do oblasti metod následující druhy informací:

  • Plně kvalifikovaný název typu (např.: String)
  • Modifikátory typu
  • Přímý název nadtřídy typu
  • Strukturovaný seznam plně kvalifikovaných názvů super rozhraní.

Oblast haldy

Halda ukládá skutečné objekty. Vytváří se při spuštění JVM. V případě potřeby může uživatel haldu ovládat. Může mít pevnou nebo dynamickou velikost. Když použijete nové klíčové slovo, JVM vytvoří instanci pro objekt v hromadě. Zatímco odkaz na tento objekt se ukládá do zásobníku. Pro každý spuštěný proces JVM existuje pouze jedna halda. Když se halda zaplní, odpadky se posbírají. Například:

 StringBuilder sb= new StringBuilder(); 

Výše uvedený příkaz vytvoří objekt třídy StringBuilder. Objekt se přiděluje haldě a referenční sb přiděluje zásobníku. Halda je rozdělena do následujících částí:

  • Mladá generace
  • Prostor přeživších
  • Stará generace
  • Stálá generace
  • Mezipaměť kódu

Typ reference

Existují čtyři typy referencí: Silný , Slabý , Měkký , a Fantomová reference . Rozdíl mezi typy odkazů spočívá v tom, že objekty na hromadě, na které odkazují, jsou způsobilé pro sběr odpadu podle různých kritérií.

Silná reference: Je to velmi jednoduché, protože jej používáme v našem každodenním programování. Žádný objekt, ke kterému je připojena silná reference, není způsobilý pro sběr odpadu. Silnou referenci můžeme vytvořit pomocí následujícího prohlášení:

 StringBuilder sb= new StringBuilder(); 

Slabá reference: Po dalším procesu sběru odpadu nepřežije. Pokud si nejsme jisti, kdy budou data znovu požadována. V tomto stavu na něj můžeme vytvořit slabý odkaz. V případě, že garbage collector zpracuje, zničí objekt. Když se znovu pokusíme tento objekt načíst, dostaneme hodnotu null. Je definován v java.lang.ref.WeakReference třída. Slabou referenci můžeme vytvořit pomocí následujícího příkazu:

 WeakReference reference = new WeakReference(new StringBuilder()); 

Měkká reference: Shromažďuje se, když má aplikace málo paměti. Sběrač odpadu nesbírá měkce dosažitelné předměty. Všechny měkké odkazované objekty jsou shromážděny předtím, než vyvolá chybu OutOfMemoryError. Měkkou referenci můžeme vytvořit pomocí následujícího příkazu:

 SoftReference reference = new SoftReference(new StringBuilder()); 

Phantom reference: Je k dispozici v java.lang.ref balík. Je definován v java.lang.ref.PhantomReference třída. Objekt, který má pouze fiktivní odkaz, který na něj ukazuje, může být sebrán, kdykoli chce garbage collector sbírat. Fantomovou referenci můžeme vytvořit pomocí následujícího příkazu:

 PhantomReference reference = new PhantomReference(new StringBuilder()); 

Oblast zásobníku

Oblast zásobníku se vygeneruje při vytvoření vlákna. Může mít pevnou nebo dynamickou velikost. Paměť zásobníku je přidělena na vlákno. Slouží k ukládání dat a dílčích výsledků. Obsahuje odkazy na objekty haldy. Také uchovává samotnou hodnotu spíše než odkaz na objekt z haldy. Proměnné, které jsou uloženy v zásobníku, mají určitou viditelnost, nazývanou rozsah.

Skládaný rám: Stack frame je datová struktura, která obsahuje data vlákna. Data vlákna představují stav vlákna v aktuální metodě.

  • Slouží k ukládání dílčích výsledků a dat. Provádí také dynamické spojování, vrací hodnoty metodami a odesílá výjimky.
  • Když se metoda zavolá, vytvoří se nový rámec. Po dokončení vyvolání metody zničí rámec.
  • Každý rámec obsahuje vlastní pole lokálních proměnných (LVA), zásobník operandů (OS) a data rámce (FD).
  • Velikosti LVA, OS a FD určené v době kompilace.
  • Pouze jeden snímek (rámec pro provedení metody) je aktivní v libovolném bodě v daném vláknu ovládání. Tento snímek se nazývá aktuální snímek a jeho metoda je známá jako aktuální metoda. Třída metody se nazývá aktuální třída.
  • Rám zastaví aktuální metodu, pokud její metoda vyvolá jinou metodu nebo pokud se metoda dokončí.
  • Rámec vytvořený vláknem je pro toto vlákno lokální a nemůže na něj odkazovat žádné jiné vlákno.

Zásobník nativních metod

Je také známý jako zásobník C. Je to zásobník pro nativní kód napsaný v jiném jazyce než Java. Java Native Interface (JNI) volá nativní zásobník. Výkon nativního zásobníku závisí na OS.

Registry PC

Každé vlákno má přidružený registr Program Counter (PC). Registr PC ukládá zpáteční adresu nebo nativní ukazatel. Obsahuje také adresu aktuálně prováděných instrukcí JVM.

Práce sběrače odpadků

Přehled sběrače odpadků

Když se program spouští v Javě, používá paměť různými způsoby. Halda je součástí paměti, kde objekty žijí. Je to jediná část paměti, která se účastní procesu sběru odpadu. Je také známá jako sběratelská hromada odpadu. Veškerý sběr odpadu zajišťuje, že na hromadě je co nejvíce volného místa. Funkce garbage collector je najít a odstranit objekty, které nejsou dostupné.

ukazatel v c

Přidělení objektu

Když se objekt alokuje, JRockit JVM zkontroluje velikost objektu. Rozlišuje malé a velké předměty. Malá a velká velikost závisí na verzi JVM, velikosti haldy, strategii sběru odpadků a použité platformě. Velikost objektu se obvykle pohybuje mezi 2 až 128 kB.

Malé objekty jsou uloženy v Thread Local Area (TLA), což je volný kus hromady. TLA se nesynchronizuje s jinými vlákny. Když se TLA zaplní, požádá o nový TLA.

objekt v programování Java

Na druhou stranu velké objekty, které se nevejdou do TLA, se přímo alokují do haldy. Pokud vlákno používá mladý prostor, uloží se přímo do starého prostoru. Velký objekt vyžaduje větší synchronizaci mezi vlákny.

Co Java Garbage Collector?

JVM řídí garbage collector. JVM rozhodne, kdy provést shromažďování odpadu. Můžeme také požádat JVM o spuštění garbage collectoru. Neexistuje však žádná záruka za žádných podmínek, že JVM bude vyhovovat. JVM spustí garbage collector, pokud zjistí, že dochází paměť. Když program Java požaduje pro garbage collector, JVM obvykle žádost v krátkém pořadí vyhoví. Nezajišťuje, že žádosti přijímají.

Důležité je pochopit, že ' když se objekt stane způsobilým pro sběr odpadu? '

Každý Java program má více než jedno vlákno. Každé vlákno má svůj spouštěcí zásobník. V programu Java lze spustit vlákno, které je metodou main(). Nyní můžeme říci, že objekt je způsobilý pro úklid, když k němu nemá přístup žádné živé vlákno. Sběratel odpadu považuje tento objekt za způsobilý ke smazání. Pokud má program referenční proměnnou, která odkazuje na objekt, tuto referenční proměnnou dostupnou pro aktivní vlákno, je volán tento objekt dosažitelný .

Zde vyvstává otázka, že ' Může Java aplikaci docházet paměť? '

Odpověď je ano. Systém garbage collection se pokouší získat objekty z paměti, když se nepoužívají. Pokud však udržujete mnoho živých objektů, shromažďování odpadků nezaručuje dostatek paměti. Účinně bude spravována pouze dostupná paměť.

Druhy svozu odpadu

Existuje pět typů sběru odpadu:

    Sériové GC:Využívá přístup mark and sweeps pro mladé a staré generace, což je menší a větší GC.Paralelní GC:Je podobný sériovému GC s tím rozdílem, že vytváří N (počet jader CPU v systému) vláken pro sběr odpadu mladé generace.Paralelní starý GC:Je podobný paralelnímu GC, kromě toho, že používá více vláken pro obě generace.Concurrent Mark Sweep (CMS) Collector:Sbírá odpadky pro starou generaci. Můžete omezit počet vláken v CMS kolektoru pomocí XX:ParalleCMSThreads=volba JVM . Je také známý jako Concurrent Low Pause Collector.G1 Garbage Collector:Je představen v Javě 7. Jeho cílem je nahradit CMS kolektor. Jedná se o paralelní, souběžný a CMS kolektor. Neexistuje žádný prostor pro mladou a starou generaci. Rozdělí haldu na několik stejně velkých hald. Nejprve shromažďuje regiony s menším počtem živých dat.

Algoritmus Mark and Sweep

JRockit JVM používá algoritmus mark a sweep pro provádění sběru odpadu. Obsahuje dvě fáze, fázi značení a fázi rozmítání.

jak převést celé číslo na řetězec v java

Označit fázi: Objekty, které jsou přístupné z vláken, nativních ovladačů a dalších kořenových zdrojů GC, jsou označeny jako živé. Každý strom objektů má více než jeden kořenový objekt. Kořen GC je vždy dosažitelný. Tedy jakýkoli objekt, který má v kořenovém adresáři kořen pro sběr odpadu. Identifikuje a označí všechny předměty, které se používají, a zbývající lze považovat za odpad.

Správa paměti v Javě

Fáze zametání: V této fázi je halda překročena, aby se našla mezera mezi živými objekty. Tyto mezery jsou zaznamenány ve volném seznamu a jsou k dispozici pro nové přidělení objektů.

Existují dvě vylepšené verze mark and sweep:

    Souběžné Mark a Sweep Paralelní Mark a Sweep

Souběžné Mark a Sweep

Umožňuje vláknům pokračovat v běhu během velké části úklidu. Existují následující typy značení:

    Počáteční označení:Identifikuje kořenovou sadu živých objektů. Provádí se, když jsou vlákna pozastavena.Souběžné značení:V tomto značení se řídí reference z kořenové sady. Najde a označí zbytek živých objektů na hromadě. Provádí se za běhu vlákna.Označení před čištěním:Identifikuje změny provedené souběžným značením. Ostatní živé předměty označené a nalezené. Provádí se za běhu vláken.Konečné označení:Označuje změny provedené předčištěním. Ostatní živé předměty označené a nalezené. Provádí se, když jsou vlákna pozastavena.

Paralelní Mark a Sweep

Využívá veškerý dostupný CPU v systému pro co nejrychlejší provádění sběru odpadu. Říká se mu také paralelní sběrač odpadu. Vlákna se nespustí, když se spustí paralelní garbage collection.

Klady Marka a Sweepa

  • Je to opakující se proces.
  • Je to nekonečná smyčka.
  • Během provádění algoritmu nejsou povoleny žádné další režie.

Nevýhody Mark and Sweep

  • Zastaví normální provádění programu, zatímco běží algoritmus garbage collection.
  • V programu se spouští vícekrát.