Sobes.tech
Junior

Igaz, hogy az primitív adattípusok mindig a veremben tárolódnak, míg a referencia típusú példányok a heapben?

sobes.tech MI

Válasz az MI-től

Nem mindig helyes.

A primitív típusok és az objektumokra mutató hivatkozások tárolása a kontextustól függ:

  • Helyi változók:

    • A metódusokon belül helyi változóként deklarált primitív típusok általában a veremben tárolódnak.
    • A helyi változóként deklarált objektumhivatkozások szintén a veremben tárolódnak. Maga az objektum példányok a halomban találhatók.
  • Objektum mezői (példányváltozók):

    • Az objektum mezőihez tartozó primitív típusok a halomban tárolódnak az objektum részeként.
    • Más objektumokra mutató hivatkozások, amelyek az objektum mezői, szintén a halomban tárolódnak az objektum részeként. A hivatkozott objektumok szintén a halomban lesznek.
  • Statikus változók:

    • A statikus változók (mind primitív, mind referencia típusúak) a osztály adatai részeként tárolódnak egy memória területen, amit gyakran PermGen-nek (Java 8 előtt) vagy Metaspace-nek (Java 8 és későbbi) neveznek, de ez elméletileg különbözik a helyi változókhoz tartozó hívásveremtől.
  • Escape Analysis:

    • A JVM alkalmazhat egy Escape Analysis nevű optimalizálást. Ha a JVM megállapítja, hogy egy metódusban létrehozott objektum nem "szökik" ki a metódusból (azaz, nem lesz elérhető kívülről), akkor ez az objektum közvetlenül a veremben helyezhető el a halom helyett (Scalar Replacement). Ez az optimalizálás elkerüli az ilyen objektumok szemétgyűjtési költségeit.

Így, bár a helyi primitív változók és az objektumokra mutató hivatkozások a veremben tárolódnak, maguk az objektumpéldányok mindig a halomban vannak, és az objektum mezői is a halomban találhatók az objektummal együtt. Az Escape Analysishez hasonló optimalizációk kivételes esetekben megváltoztathatják ezt a viselkedést.