Android uygulamaları çalıştırma bağlamında çağrı yığını ve yığını hakkında bilgi verin.
sobes.tech yapay zeka
AI'dan gelen yanıt
Çağrı yığını, fonksiyon/metod çağrılarıyla ilgili bilgileri geçici olarak depolamak için kullanılan bir bellek alanıdır. Her çağrı, şu öğeleri içeren bir Çerçeve (Stack Frame) oluşturur:
- Yerel değişkenler.
- Metod argümanları.
- Dönüş adresi.
Çerçeveler, LIFO (Last-In, First-Out) prensibiyle yığına eklenir. Bir metod tamamlandığında, onun çerçevesi yığından kaldırılır.
Heap (Yığın) ise, nesnelerin dinamik olarak tahsis edildiği bir bellek alanıdır. Nesneler new operatörüyle oluşturulur ve onlara referanslar olduğu sürece yaşamaya devam ederler. Referanslar kalmazsa, bunlar Çöp Toplama (Garbage Collection) adayları haline gelir.
Ana farklar:
| Özellik | Çağrı Yığını | Heap |
|---|---|---|
| Yaşam süresi | Kısa (metod bitiminde) | Uzun (referanslar varsa) |
| Bellek tahsisi | Otomatik | Dinamik (new) |
| Serbest bırakma | Otomatik (metod bitiminde) | Çöp Toplama (Garbage Collection) |
| Boyut | Sınırlı, önceden belirlenmiş | Esnek, kullanılabilir belleğe bağlı |
| Veri tipi | İlkel tipler, nesne referansları | Nesneler |
Android'de, her thread kendi çağrı yığınına sahiptir, ancak heap tüm threadler arasında paylaşılır. Çok derin rekursiyon veya çok fazla yerel değişken oluşturma durumunda yığın taşması (StackOverflowError) meydana gelir. Heap'teki bellek yetersizliği (OutOfMemoryError), yeterli boş alan kalmadığında nesne tahsis etmeye çalışırken oluşur.
// Yığın ve heap kullanımı örneği
public class Ornek {
private int örnekDegiskeni; // Nesne parçası olarak heap'te bulunur
public void bazıMetod(int parametre) { // parametre - yığında
int yerelDegisken = 10; // yerelDegisken - yığında
// Nesne heap'te oluşturulur
MyObject nesne = new MyObject(); // nesne (referans) - yığında, nesne - heap'te
nesne.birŞeyYap(yerelDegisken); // yerelDegisken, yeni çerçevedeki yığında değer olarak geçirilir
}
private class MyObject {
public void birŞeyYap(int deger) { // deger - doSomething çerçevesinde yığında
// İç içe metod, yeni bir çerçeve ekler
başkaBirMetod();
}
}
private void başkaBirMetod() {
// Bu metod yeni bir çerçeve oluşturur
}
}