Sobes.tech
Junior

Je pravda, že primitívne dátové typy sa vždy ukladajú na zásobník a inštancie referenčných typov na haldu?

sobes.tech AI

Odpoveď od AI

Nie je to vždy pravda.

Ukladanie primitívnych dátových typov a odkazov na objekty závisí od kontextu:

  • Lokálne premenné:

    • Primitívne dátové typy deklarované ako lokálne premenné v rámci metód sa zvyčajne ukladajú na zásobník.
    • Odkazy na objekty deklarované ako lokálne premenné sa tiež ukladajú na zásobník. Samotné inštancie objektov sa nachádzajú na halde.
  • Polia objektov (inštančné premenné):

    • Primitívne dátové typy, ktoré sú poliami objektov, sa ukladajú na halde ako súčasť samotného objektu.
    • Odkazy na iné objekty, ktoré sú poliami objektov, sa tiež ukladajú na halde ako súčasť objektu. Referencované objekty budú tiež na halde.
  • Statické premenné:

    • Statické premenné (ako primitívne, tak referenčné) sa ukladajú ako súčasť dát triedy v oblasti pamäti, ktorá sa často nazýva PermGen (pred Java 8) alebo Metaspace (Java 8 a vyššie), ale koncepčne sa líšia od zásobníka volaní pre lokálne premenné.
  • Escape Analysis:

    • JVM môže použiť optimalizáciu nazvanú Escape Analysis. Ak JVM zistí, že objekt vytvorený v metóde "neunikne" za hranice tejto metódy (t.j. nie je dostupný zvonku), potom tento objekt môže byť alokovaný priamo na zásobník namiesto haldy (Scalar Replacement). Táto optimalizácia umožňuje vyhnúť sa nákladom na zber odpadu pre takéto objekty.

Takže, hoci lokálne primitívne premenné a odkazy na objekty sa ukladajú na zásobník, samotné inštancie objektov sú vždy uložené na halde, a polia objektov sa nachádzajú na halde spolu s objektom. Optimalizácie ako Escape Analysis môžu toto správanie meniť v výnimočných prípadoch.