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.