Sobes.tech
Middle

Android tətbiqlərinin işləməsi kontekstində çağrı yığını və yığını haqqında danışın.

sobes.tech Süni İntellekt

AI-dan cavab

Çağrı yığını, funksiya/metod çağrıları ilə əlaqəli məlumatların müvəqqəti saxlanması üçün istifadə olunan yaddaş sahəsidir. Hər çağrı bir (Stack Frame) çərçivə yaradır və bu çərçivə aşağıdakıları ehtiva edir:

  • Yerli dəyişənlər.
  • Metodun arqumentləri.
  • Geri dönüş ünvanı.

Çərçivələr LIFO (Last-In, First-Out) prinsipi ilə yığına əlavə olunur. Metod tamamlandıqda, onun çərçivəsi yığından silinir.

Heap (yığım) isə, obyektlərin dinamik ayrılması üçün istifadə olunan yaddaş sahəsidir. Obyektlər new operatoru ilə yaradılır və onlara referanslar mövcud olduqca yaşayır. Əgər referanslar yoxdursa, onlar Garbage Collection üçün namizəd olurlar.

Əsas fərqlər:

Xüsusiyyət Çağrı Yığını Yığım
Həyat müddəti Qısa (metod bitdikdən sonra) Uzun (referanslar mövcud olduqca)
Yaddaş ayırması Avtomatik Dinamik (new)
Azad etmə Avtomatik (metod bitdikdə) Garbage Collection (çöp toplanması)
Ölçü Məhdud, əvvəlcədən təyin olunmuş Elastik, mövcud yaddaşdan asılıdır
Məlumat tipi Primitiv tiplər, obyekt referansları Obyektlər

Android-də, hər bir iplik öz çağrı yığınına malikdir, yığım isə bütün tətbiq iplikləri arasında paylaşılır. Yığın daşması (StackOverflowError) çox dərin rekursiya və ya çox sayda yerli dəyişən yaradılması zamanı baş verir. Heap-də yaddaş çatışmazlığı (OutOfMemoryError) isə, obyektin ayrılması zamanı kifayət qədər boş yer olmadıqda baş verir.

// Yığın və yığım istifadəsi nümunəsi

public class Example {
    private int nümunəDəyişəni; // Yığımda obyektin bir hissəsi kimi

    public void bəziMetod(int parametr) { // parametr - yığında
        int yerliDəyişən = 10; // yerliDəyişən - yığında

        // Obyekt yığımda yaradılır
        MyObject obj = new MyObject(); // obj (referans) - yığında, obyekt - yığımda

        obj.eləBirŞeyEt(yerliDəyişən); // yerliDəyişən yeni çərçivədə dəyər kimi ötürülür
    }

    private class MyObject {
        public void eləBirŞeyEt(int dəyər) { // dəyər - eləBirŞeyEt çərçivəsində yığında
            // İç içə metod, yeni çərçivə əlavə edir
            başqaBirMetod();
        }
    }

    private void başqaBirMetod() {
        // Bu metod yeni çərçivə yaradır
    }
}