Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky
V Java, halda je oblasť pamäte používaná na dynamické pridelenie pamäte. Tam sú uložené všetky objekty Java (inštancie tried) a polia. Nie je to * nie * štruktúra údajov, ako je štruktúra údajov HADE, s ktorou sa môžete stretnúť v kurzoch algoritmov (Min-Heap, Max-Heap). Je nevyhnutné pochopiť toto rozlíšenie.
Kľúčové charakteristiky haldy Java:
1. Dynamické pridelenie: Pamäť pre objekty sa prideľuje za behu, nie kompiláciu času, podľa potreby. Vopred nepredefinujete presnú veľkosť objektov.
2. Zdieľaný zdroj: Halda Java je zdieľaný zdroj vo všetkých vláknach v rámci JVM. To znamená, že viacero vlákien má prístup k objektom v halde a úpravy. Mechanizmy synchronizácie (napríklad „synchronizované“ bloky, zámky atď.) Sú potrebné na správu súbežného prístupu a zabránenie korupcii údajov.
3. Zbierka odpadu: Halda je spravovaná zberateľom odpadu Java (GC). GC automaticky reguluje pamäť obsadenú objektmi, ktoré už nie sú dosiahnuteľné (t. To eliminuje potrebu manuálnej správy pamäte, ako je `Malloc ()` a `free ()` v jazykoch ako C ++.
4. Lifecycle objektu: Objekty sa vytvárajú v halde pomocou kľúčového slova `new`. Bývajú v hromade, až kým sa nestanú nedosiahnuteľnými a nakoniec ich zhromaždí GC.
5. je nastaviteľná: Veľkosť haldy je možné nakonfigurovať pri spustení virtuálneho počítača Java (JVM) pomocou možností príkazového riadku ako `-xms` (počiatočná veľkosť haldy) a` -xmx` (maximálna veľkosť haldy).
Ako funguje halda:
1. tvorba objektov: Keď vytvoríte nový objekt pomocou `new`, JVM prideľuje pamäť pre objekt na halde. Polia objektu sa inicializujú podľa definície triedy.
`` `Java
trieda myclass {
int x;
Názov reťazca;
}
verejná trieda hlavná {
public static void main (String [] args) {
MyClass obj =new myclass (); // Object je vytvorený na halde
obj.x =10;
obj.name ="Príklad";
}
}
`` `
V tomto príklade `new myClass ()` prideľuje pamäť na haldu pre objekt typu `myClass`. Premenná `obj` v` main` je * referencia * na umiestnenie tohto objektu na halde. Nie je to samotný objekt, ale skôr ukazovateľ alebo adresa.
2. Referencie objektov: Objekty sú prístupné a manipulované prostredníctvom odkazov. Viaceré referencie môžu ukazovať na ten istý objekt na halde. Ak sa všetky odkazy na objekt stratia (stávajú sa nulové, choďte z rozsahu atď.), Objekt sa stane nedosiahnuteľným.
`` `Java
MyClass obj1 =new myclass ();
MyClass obj2 =obj1; // obj2 teraz odkazuje na rovnaký objekt ako obj1
obj1 =null; // obj1 už viac ne odkazuje na objekt. Ale obj2 stále áno.
// Objekt MyClass je oprávnený iba na zber odpadu, keď sa OBJ2 stane nedosiahnuteľným.
`` `
3. Proces zberu odpadu:
* Analýza dosiahnutia: GC určuje, ktoré objekty sú stále dosiahnuteľné sledovaním odkazov začínajúcich z koreňových objektov (napr. Lokálne premenné v aktívnych metódach, statických premenných).
* Označenie: Dosiahnuteľné objekty sú označené ako „živé“.
* zametanie/kompaktné: Nedosiahnuteľné objekty sa odstránia z haldy. Niektoré algoritmy GC tiež zhutnia haldu, aby sa znížila fragmentácia.
4. fragmentácia haldy: V priebehu času sa môže halda fragmentovať, čo znamená, že voľná pamäť je rozptýlená v malých, neúmyselných blokoch. To môže sťažiť pridelenie veľkých predmetov. Algoritmy GC často zahŕňajú fázy zhutňovania na konsolidáciu voľnej pamäte.
5. halda Štruktúra (generačná hypotéza): Moderné GC často rozdeľujú hromadu na generácie na základe „generačnej hypotézy“, ktorá uvádza, že väčšina objektov má krátke životnosti. Halda je zvyčajne rozdelená na:
* Mladá generácia: Kde sa vytvárajú nové objekty. Ďalej sa rozdelí na:
* Eden Space: Kde je väčšina nových objektov pôvodne pridelená.
* Survivor Spaces (S0, S1): Používa sa na držanie predmetov, ktoré prežili menšie GC cykly.
* stará generácia (držaná generácia): Objekty, ktoré prežili viac cyklov GC v mladej generácii, sú povýšené na starej generácii.
* Trvalá generácia (permgen - zastaraná v Java 8, nahradená metaspace): Používa sa na ukladanie metadát triedy a ďalšie statické informácie. (Dôležitá poznámka:Permgen bol nahradený MeAspace v Java 8 a neskôr, ktorý je pridelený z natívnej pamäte a nie z hromady.)
Generačný prístup umožňuje GC zamerať svoje úsilie na mladú generáciu, kde sa vytvára väčšina odpadkov.
Halda Tuning:
Úprava veľkosti haldy môže výrazne ovplyvniť výkon aplikácie.
* Príliš malé: Časté GC cykly, ktoré vedú k degradácii výkonu a potenciálne `outofmemoryerror`.
* Príliš veľké: Dlhšie pozastavenia GC, ktoré ovplyvňujú citlivosť.
Je dôležité monitorovať aktivitu GC a upraviť veľkosť haldy na základe potrieb aplikácií. S tým môžu pomôcť nástroje ako JConsole, VisualVM a Profilers.
Kľúčové rozdiely od zásobníka:
* halda: Používa sa na dynamické pridelenie objektov. Zdieľané naprieč vláknami. Spravované spoločnosťou GC.
* Stack: Používa sa na ukladanie miestnych premenných a informácie o volaní metód. Vlákno špecifické (každé vlákno má svoj vlastný zásobník). Pamäť sa prideľuje a vyriešuje spôsobom LIFO (posledný, prvý).
v súhrne:
Halda Java je oblasť dynamickej pamäte, kde sa nachádzajú objekty. Pochopenie toho, ako funguje halda, vrátane jej štruktúry, úlohy zberateľa odpadu a potenciálnych problémov, ako je fragmentácia, je rozhodujúce pre písanie efektívnych a robustných aplikácií Java. Pre optimalizáciu výkonu sú nevyhnutné správne veľkosť haldy a ladenie GC. Pamätajte, že ide o pamäťovú oblasť spravovanú pomocou JVM a * nie * halda.