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

2.9 KiB
Raw Blame 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