Sobes.tech
Middle

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