Sobes.tech
Junior

Je pravda, že primitivní datové typy jsou vždy uloženy na zásobníku a instance referenčních typů na haldě?

sobes.tech AI

Odpověď od AI

Není to vždy pravda.

Ukládání primitivních datových typů a odkazů na objekty závisí na kontextu:

  • Lokální proměnné:

    • Primitivní datové typy deklarované jako lokální proměnné uvnitř metod jsou obvykle uloženy na zásobníku.
    • Odkazy na objekty deklarované jako lokální proměnné jsou také uloženy na zásobníku. Samotné instance objektů se nacházejí na haldě.
  • Políčka objektů (instance proměnné):

    • Primitivní datové typy, které jsou poli objektů, jsou uloženy na haldě jako součást samotného objektu.
    • Odkazy na jiné objekty, které jsou poli objektů, jsou také uloženy na haldě jako součást objektu. Referencované objekty budou také na haldě.
  • Statické proměnné:

    • Statické proměnné (jak primitivní, tak referenční) jsou uloženy jako součást dat třídy v oblasti paměti, která se často nazývá PermGen (před Java 8) nebo Metaspace (Java 8 a výše), ale koncepčně se liší od zásobníku volání pro lokální proměnné.
  • Escape Analysis:

    • JVM může použít optimalizaci nazvanou Escape Analysis. Pokud JVM zjistí, že objekt vytvořený v metodě "neunikne" za hranice této metody (tj. není dostupný zvenčí), může být tento objekt přímo alokován na zásobník místo na haldu (Scalar Replacement). Tato optimalizace umožňuje vyhnout se nákladům na sběr odpadu pro takové objekty.

Tudíž, i když se lokální primitivní proměnné a odkazy na objekty ukládají na zásobník, samotné instance objektů jsou vždy uloženy na haldě, a pole objektů jsou na haldě spolu s objektem. Optimalizace jako Escape Analysis mohou toto chování v mimořádných případech změnit.