# Uspořádání paměti - **Paměť je** při vykonávání programu **rozdělena na zásobník a haldu** - Obě části jsou fyzicky **ve stejné paměti (RAM)**, jen **na jiném místě** ### Zásobník a halda - **Při vykonávání programu se používají obě části**, některé věci jsou uloženy v zásobníku, jiné na haldě - **POZOR**! - **Neplést s datovými strukturami zásobník a halda** (viz předmět KIV/PPA2), jde o něco zcela jiného - Bohužel v češtině i angličtině je pro obojí stejný název - Část paměti halda není ani podobná datové struktuře halda - Část paměti zásobník je principiálně podobný datové struktuře zásobník #### Zásobník (stack) - Slouží pro ukládání volání jednotlivých metod - Při volání metody se vytvoří nový zásobníkový rámec (stack frame), ve kterém se alokuje (tj. vytvoří) místo pro - Pomocné hodnoty, které Java používá pro řízení běhu programu - Formální parametry - Všechny lokální proměnné - Proměnné základních datových typů jsou zde uloženy přímo - Lokální referenční proměnné jsou zde uloženy přímo, ale objekty (instance), na které ukazují, jsou uloženy na haldě - Při dokončení metody se zásobníkový rámec uvolní - Je podstatně menší než halda (řádově 1 MB) - Může se stát, že dojde volné místo na zásobníku - Typicky při vnořeném volání příliš mnoha metod (typicky při použití rekurze – viz předmět KIV/PPA2) - Program se ukončí a objeví se chyba přetečení zásobníku (```stack overflow```) #### Halda (heap) - Slouží **pro ukládání objektů (instancí) a polí** - Při volání konstruktoru se alokuje místo na haldě potřebné pro uložení objektu, mj. jeho proměnných instance - Paměť uvolní automaticky garbage collector, když na instanci neukazuje žádná referenční proměnná (ani ze zásobníku, ani z instančních referenčních proměnných uložených v instancích na haldě) - Paměť nelze uvolnit ručně, ale lze JVM požádat, aby zvýšil úsilí automatického uvolňování paměti na haldě voláním metody ```System.gc();``` - Po dokončení metody JVM udělal vše pro uvolnění paměti odstraněním instancí, na něž již neukazují referenční proměnné - Je **podstatně větší než zásobník** (většina dostupné paměti – řádově GB) - Přesto se může stát, že dojde volné místo na haldě - Typicky při vytváření příliš mnoha a/nebo příliš velkých objektů (nebo polí) - Program se ukončí a objeví se chyba nedostatku paměti (```out of memory```) - Při postupném zaplňování paměti se před chybou program typicky zpomalí, což je důsledek zvýšené snahy garbage collectoru o uvolnění paměti - Oblast metod (method area) - Část haldy, ve které jsou uloženy přeložené výkonné kódy metod (třídy i instance) a také proměnné třídy