# 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

