Junior
Kas on õige väide, et primitiivsed andmetüübid salvestatakse alati virna ja viidetüübi näited virna?
sobes.tech AI
Vastus AI-lt
Ei alati õige.
Primitiivsete andmetüüpide ja objektiviidete viitamiste salvestamine sõltub kontekstist:
-
Kohalikud muutujad:
- Primitiivsed andmetüübid, mis on määratletud meetodi sees kohalike muutujatena, tavaliselt salvestatakse virnale.
- Objektiviidete viited, mis on määratletud kohalike muutujatena, samuti salvestatakse virnale. Objekti eksemplarid ise asuvad kogumiskohas.
-
Objektide väljad (näited):
- Primitiivsed andmetüübid, mis on objektide väljad, salvestatakse kogumiskohas osana objekti enda.
- Teiste objektide viited, mis on objektide väljad, samuti salvestatakse kogumiskohas osana objekti enda. Viidatud objektid asuvad samuti kogumiskohas.
-
Statilised muutujad:
- Statilised muutujad (nii primitiivsed kui viitavad) salvestatakse klassi andmetena mälualale, mida sageli nimetatakse PermGeniks (enne Java 8) või Metaspace'iks (Java 8 ja uuemad), kuid see erineb kontekstist, kus salvestatakse kohalikke muutujatena meetodi kutsesteki.
-
Escape Analysis:
- JVM võib rakendada optimeerimist nimega Escape Analysis. Kui JVM tuvastab, et meetodis loodud objekt "ei põgene" selle meetodi piiridest (st. see ei muutu väljast kättesaadavaks), siis võib see objekt olla otse virnale eraldatud (Scalar Replacement). See optimeerimine võimaldab vältida kogumiskulutusi sellistele objektidele.
Seega, kuigi kohalikud primitiivsed muutujad ja objektiviited salvestatakse virnale, asuvad objekti eksemplarid alati kogumiskohas ning objektide väljad asuvad koos objektiga kogumiskohas. Optimeerimised nagu Escape Analysis võivad seda käitumist erandjuhtudel muuta.