FAV-ZCU/KIV PPA1/7. Uspořádání paměti.md

45 lines
2.9 KiB
Markdown
Raw Permalink Normal View History

# 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