Sobes.tech
Middle

Rääkige Android rakenduste töö kontekstis kõnevirna ja virna kohta.

sobes.tech AI

Vastus AI-lt

Kutsungipuu — see on mälu piirkond, mida kasutatakse ajutise teabe hoidmiseks, mis on seotud funktsioonide/metoodide väljakutsetega. Iga väljakutse loob Stack Frame'i, mis sisaldab:

  • Kohalikke muutujaid.
  • Metoodide argumente.
  • Tagastamise aadressi.

Frame'id lisatakse virnale LIFO (Last-In, First-Out) põhimõttel. Kui metoodus lõpeb, eemaldatakse selle frame virnast.

Heap (kõrve) on mälu piirkond, mida kasutatakse objektide dünaamiliseks eraldamiseks. Objekte luuakse new operaatoriga ja elavad seni, kuni nendele on viiteid. Kui viiteid pole, muutuvad nad prügikoristuse (Garbage Collection) kandidaadiks.

Peamised erinevused:

Omadus Väljakutse virn Kõrve
Eluea aeg lühike (kuni meetodi lõpuni) pikk (kuni viited olemas)
Mälu eraldamine automaatne dünaamiline (new)
Mälu vabastamine automaatne (meetodi lõpus) prügikoristus
Suurus piiratud, eelnevalt määratletud paindlik, sõltub saadaval olevast mälust
Andmetüüp primitiivsed tüübid, viited objektidele objektid

Androidis on iga niit omaenda väljakutse virn, kuid kõver jagatakse kõigi niitide vahel. Virna ületäitumine (StackOverflowError) toimub liiga sügava rekursiooni või liiga paljude kohalike muutujate loomise korral. Mälu puudus kõvas (OutOfMemoryError) tekib, kui püüate eraldada objekti, kui kõvas pole piisavalt vaba ruumi.

// Näide virna ja kõvera kasutamisest

public class Example {
    private int instanceVariable; // asub kõvas objekti osana

    public void someMethod(int parameter) { // parameter — virnas
        int localVariable = 10; // localVariable — virnas

        // Objekt luuakse kõvas
        MyObject obj = new MyObject(); // obj (viide) — virnas, ise objekt — kõvas

        obj.doSomething(localVariable); // localVariable edastatakse väärtusena uue fooni virnale
    }

    private class MyObject {
        public void doSomething(int value) { // value — doSomething virna foonis
            // Sisemine meetod, lisab uue frame'i virnale
            anotherMethod();
        }
    }

    private void anotherMethod() {
        // See meetod loob uue frame'i virnale
    }
}