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