44 lines
2.9 KiB
Markdown
44 lines
2.9 KiB
Markdown
# 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
|
||
|