Sobes.tech
Middle

Խոսեք Android հավելվածների աշխատանքի համատեքստում զանգի բլոկի և հոսքի մասին։

sobes.tech AI

Պատասխան AI-ից

Զանգվածի կանչը՝ դա հիշողության տարածք է, որը օգտագործվում է ժամանակավոր պահելու համար ֆունկցիաների/մեթոդների կանչերի հետ կապված տեղեկատվությունը: Յուրաքանչյուր կանչ ստեղծում է Stack Frame, որը պարունակում է՝

  • տեղական փոփոխականներ:
  • մեթոդի արգումենտներ:
  • վերադարձի հասցե:

Ֆրեյմերը ավելացվում են ստեկին ըստ LIFO (Last-In, First-Out) սկզբունքի: Երբ մեթոդը ավարտվում է, նրա ֆրեյմը հեռացվում է ստեկից:

Heap (հավաք)՝ դա հիշողության տարածք է, որը օգտագործվում է օբյեկտների դինամիկ հատկացման համար: Օբյեկտները ստեղծվում են new օպերատորով և ապրում են այնքան ժամանակ, քանի դեռ դրանց վրա կա հղում: Եթե հղումներ չկան, նրանք դառնում են աղբարկղի հավաքագրման թեկնածուներ:

Հիմնական տարբերությունները՝

Գծագիր Զանգվածի կանչը Հավաք
Կյանքի ժամանակը Կարճ (մեթոդի ավարտից առաջ) Երկար (մինչև հղումները չլինեն)
Հիշողության հատկացում Ավտոմատական Դինամիկ (new)
Հիշողության ազատում Ավտոմատ (մեթոդի ավարտից հետո) Աղբարկղի հավաքագրում
չափը սահմանափակ, նախորոշված ճկուն, կախված հասանելի հիշողությունից
Տվյալների տեսակ հիմնական տեսակներ, հղումներ օբյեկտներին Օբյեկտներ

Android-ում, յուրաքանչյուր թել ունի իր սեփական կանչի ստեկը, իսկ հավաքը բաժանվում է բոլոր թելերի միջև: Ստեկի լրացում (StackOverflowError) տեղի է ունենում շատ խոր ռեկուրսիայի կամ շատ տեղական փոփոխականների ստեղծման դեպքում: Հիշողության պակասը հավաքում (OutOfMemoryError) առաջանում է, երբ փորձում եք հատկացնել օբյեկտ, իսկ հավաքում տեղը չի բավականացնում:

// Օրինակ՝ ստեկի և հավաքի օգտագործումը

public class Example {
    private int instanceVariable; // գտնվում է հավաքում որպես օբյեկտի մաս

    public void someMethod(int parameter) { // parameter - ստեկում
        int localVariable = 10; // localVariable - ստեկում

        // Օբյեկտ ստեղծվում է հավաքում
        MyObject obj = new MyObject(); // obj (հղում) - ստեկում, իսկ օբյեկտը - հավաքում

        obj.doSomething(localVariable); // localVariable փոխանցվում է արժեքով նոր ֆրեյմի ստեկին
    }

    private class MyObject {
        public void doSomething(int value) { // value - doSomething-ի ստեկի ֆրեյմում
            // Ներքին մեթոդ, ավելացնում է նոր ֆրեյմ ստեկին
            anotherMethod();
        }
    }

    private void anotherMethod() {
        // Այս մեթոդը ստեղծում է նոր ֆրեյմ ստեկում
    }
}