Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky

Domáce Hardware Siete Programovanie Softvér Otázka Systémy

Čo je hromada v Jave a ako funguje v programovacom jazyku?

Halda in Java:Dynamická alokácia pamäte

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.

Najnovšie články

Copyright © počítačové znalosti Všetky práva vyhradené