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

45 lines
2.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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