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
}
}