Nisa Efendioğlu

Android ile Bellek Yönetimi: Heap, Stack, Value ve Reference Type'lar

Profile picture

Nisa Efendioğlu

Post Image

📱 Android ile Bellek Yönetimi: Heap, Stack, Value ve Reference Tipler

Mobil uygulama geliştirirken yalnızca işlevselliği değil, performansı da düşünmek zorundayız. Bir Android uygulaması çalışırken bellek yönetimi kritik bir rol oynar. Özellikle Kotlin gibi JVM tabanlı dillerde bellek; Stack ve Heap adlı iki ana bölgeye ayrılır. Bu yazıda, Stack ve Heap bellek nedir, Value ve Reference Type’lar nasıl çalışır, avantaj ve dezavantajları nelerdir, hadi gel beraber detaylı şekilde inceleyelim.

📌 Bellek Yapısı: Stack ve Heap Nedir?

📌 Stack Bellek (Yığın Bellek)

  • Geçici ve küçük veri bloklarını tutar.
  • Metot çağrıları sırasında kullanılan lokal değişkenler, primitive değerler ve referans adresleri burada saklanır.
  • LIFO (Last In First Out) mantığıyla çalışır.
  • Metot çalıştığında değişken Stack’e eklenir, metot bittiğinde otomatik olarak silinir.
  • Oldukça hızlıdır çünkü bellek alanı sürekli düzenli bir şekilde eklenip çıkarılır.

Avantajları:

  • Çok hızlıdır.
  • Hafızadan çıkma süresi belirlidir.

Dezavantajları:

  • Küçük boyutludur.
  • Sadece lokal (geçici) verileri saklayabilir.

📌 Heap Bellek (Yığın Belleği)

  • Dinamik olarak oluşturulan nesneler burada saklanır.
  • Android’de Activity, Fragment, View, Object gibi nesneler Heap bellekte yer alır.
  • Nesneler burada kalıcıdır, manuel veya Garbage Collector (GC) tarafından temizlenene kadar bellekte kalır.
  • Referans Tipleri Stack’te, onların işaret ettiği veri ise Heap’te bulunur.

Avantajları:

  • Daha esnek ve geniştir.
  • Karmaşık veri yapıları (Array, List, Object vb.) için idealdir.

Dezavantajları:

  • Stack’e göre daha yavaştır.
  • Garbage Collector tarafından kontrol edildiği için ani temizlemeler performansı etkileyebilir.

📌 Kotlin’de Veri Tipleri: Value ve Reference Type Nedir?

📌 Value Type (Değer Tipi)

  • Verinin kendisi saklanır.
  • Primitive tipler: Int, Double, Float, Boolean, Char vb.
  • Stack bellekte tutulur.
  • Başka bir değişkene atandığında, değeri kopyalanır.

Örnek:

image

Burada a ve b bağımsızdır.

Avantajları:

  • Hızlıdır.
  • Bellek yönetimi kolaydır.

Dezavantajları:

  • Her atamada yeni bir kopya oluşturur.
  • Karmaşık veri yapılarını yönetemez.

📌 Reference Type (Referans Tipi)

  • Verinin adresini (referansını) saklar.
  • Array, String, List, Map, Object, Custom Class gibi yapılar referans tipidir.
  • Referans Stack’te, veri Heap’te saklanır.
  • Başka bir değişkene atandığında, adres kopyalanır, veri ortak olur.

Örnek:

image

Burada list1 ve list2 aynı adresi işaret eder.

Avantajları:

  • Karmaşık veri yapıları için idealdir.
  • Hafızada tek veri tutulur, fazla kopyalama yapılmaz.

Dezavantajları:

  • Garbage Collector kontrolüne bağlıdır.
  • Adres paylaşımı nedeniyle veri değişimleri dikkatli yapılmalıdır.

📊 Value Type ve Reference Type Karşılaştırması

image

📌 Avantaj ve Dezavantaj Özeti:

image

📌 Sonuç:

Value ve Reference tipler arasındaki farkı bilmek:

  • Performans optimizasyonu
  • Memory leak önleme
  • Veri paylaşımı ve kontrolünü sağlama
  • Bellek yönetim stratejileri geliştirme

için kritik öneme sahiptir. Özellikle Android projelerinde, büyük veri listeleri, adapter kullanımı, image loader’lar gibi yapılar bu farkı doğrudan etkileyebilir.

📌 Bonus Bilgi 👀

Memory Profiler (Android Studio) kullanarak, uygulamanın Heap ve Stack kullanımını anlık izleyebilir, GC aktivitelerini takip edebilirsin.

📌 Heap ve Stack Bellek Üzerinde Çalışma Mantığı

Bir metot çağrıldığında:

  1. Metodun değişkenleri Stack’e yerleşir.
  2. Eğer metot içerisinde obje oluşturulursa, Stack’te referansı, Heap’te nesnenin kendisi oluşur.
  3. Metot bittiğinde Stack’teki veriler temizlenir, ancak Heap’teki nesne varsa ve hâlâ referans varsa yaşamaya devam eder.
  4. Kullanılmayan Heap verileri Garbage Collector tarafından temizlenir.

📌 Kotlin’de Garbage Collector Nedir?

  • JVM üzerinde çalışan Kotlin uygulamalarında bellek yönetimini otomatik yapan sistemdir.
  • Kullanılmayan nesneleri tespit eder ve Heap belleğini temizler.
  • Android uygulamasında performansı etkileyebilir. Özellikle büyük veri işlemleri ve animasyonlarda GC çağrıları takılmalara sebep olabilir.

📌 Avantajlar ve Dezavantajlar Tablosu

image

📌 Neden Bilmeliyiz?

✔ Performans optimizasyonu için kritik

✔ Memory leak (hafıza sızıntısı) risklerini anlamak için gerekli

✔ Büyük veri işlemleri ve animasyonlarda GC takılmalarını önlemek

✔ Kodun nasıl çalıştığını ve neden bazen yavaşladığını anlamak

📌 Sonuç

Android’de Kotlin ile uygulama geliştirirken Stack ve Heap bellek yapısını, Value ve Reference Type farkını bilmek, hem performanslı hem de sağlıklı kod yazabilmek için şart. Özellikle nesne referansları ve veri kopyalama işlemleri doğru yönetilmezse performans kaybına ve memory leak sorunlarına yol açabilir.

Kısaca:

  • Küçük ve geçici veriler için Value Type kullan.
  • Karmaşık ve dinamik veri yapıları için Reference Type kullan.
  • Heap ve Stack farkını bil, performansını garanti altına al.

📌 Bonus: Kotlin’de Value ve Reference Type Ayırma

Kotlin’de tüm sınıflar aslında reference type’tır. Ancak data class’lar eşitlik kontrolü ve veri taşıma için optimize edilmiştir. val ve var kullanımı da önemli:

  • val → referansı sabit, nesne değişebilir.
  • var → referansı değişebilir.

Örnek:

image

Burada user1 sabit kalır, user2 yeni bir nesne olur.

Umarım her şey anlaşılır olmuştur. 👀

Keyifli kodlamalar!

Go back