Sobes.tech
Junior

Vai ir pareizi apgalvots, ka primitie datu tipi vienmēr tiek glabāti stekā, bet atsauces datu tipu piemēri - kaudzē?

sobes.tech AI

Atbilde no AI

Ne vienmēr tas ir pareizi.

Primitīvo datu tipu un atsauces uz objektu glabāšana ir atkarīga no konteksta:

  • Lokālās mainīgās:

    • Primitīvie datu tipi, kas deklarēti kā lokālās mainīgās metožu iekšpusē, parasti tiek glabāti steka vietā.
    • Atsauces uz objektu, kas deklarētas kā lokālās mainīgās, arī tiek glabātas steka vietā. Paši objekta eksemplāri tajā pašā laikā atrodas atmiņas kaudzē.
  • Objektu lauki (eksemplāra mainīgās):

    • Primitīvie datu tipi, kas ir objektu lauki, tiek glabāti atmiņas kaudzē kā paša objekta daļa.
    • Atsauces uz citām objektiem, kas ir objektu lauki, arī tiek glabātas atmiņas kaudzē kā paša objekta daļa. Atsauces uz objektiem arī atradīsies atmiņas kaudzē.
  • Statiskie mainīgie:

    • Statiskie mainīgie (gan primīvi, gan atsauces) tiek glabāti kā klases dati atmiņas apgabalā, ko bieži sauc par PermGen (pirms Java 8) vai Metaspace (Java 8 un jaunākās versijas), bet būtībā tas atšķiras no metožu izsaukumu steka vietas lokālajiem mainīgajiem.
  • Escape Analysis:

    • JVM var piemērot optimizāciju, ko sauc par Escape Analysis. Ja JVM nosaka, ka objekts, kas izveidots metodē, "nepazūd" ārpus šīs metodes (t.i., tas nav pieejams ārpusē), tad šis objekts var tikt tieši alocēts steka vietā, nevis kaudzē (Scalar Replacement). Šī optimizācija ļauj izvairīties no papildu izmaksām, kas saistītas ar atkritumu savākšanu šādiem objektiem.

Tādējādi, lai gan lokālās primīvas mainīgās un atsauces uz objektu tiek glabātas steka vietā, paši objekta eksemplāri vienmēr ir atmiņas kaudzē, un objekta lauki atrodas kopā ar objektu atmiņas kaudzē. Optimizācijas, piemēram, Escape Analysis, var mainīt šo uzvedību izņēmuma gadījumos.