Java Stack bellekte dizi işlemleri nasıl yürür?

350070

Megapat
İlk 5 Haneli Mesajınız!
Katılım
6 Aralık 2017
Mesajlar
10.566
Makaleler
4
Çözümler
40
Java:
public static void main(String[] args)
{
   ... //önceki işlemler
    int[] dizi = new int[10]; //1.satır
    dizi = new int[4]; //2.satır
}

Yukarıdaki kodu çalıştırdığımız zaman aşağıdaki durum mu olur?
1. satır stack bellekte 10 tane int alanı ayırır.
2. satır 10 tane int alanını stack bellekten siler ve 4 tane int alanı ayırır.
Daha sonra stack bellekte önceden değişkenler yeniden sıralanır.

Silinir dediğim kısımlar garbage collectorun yaptığı otomatik silme olayı.

Arkadaşlar, eğer benim yazdığım durum olmuyorsa, nasıl bir durum oluşur?
 
Son düzenleme:
Daha sonra stack bellekte önceden değişkenler yeniden sıralanır.
Bellekte yeniden sıralama olmaz, sadece referans değişimi olur. Aynı isimde iki değişken tanımlarsan, değişken yeni veriyi işaret eder.

1. satır: dizi adlı bir değişken oluşturulur ve bu referans 10 elemanlı bir diziyi işaret eder.
2. satır: dizi referansı artık 4 elemanlı yeni bir diziyi işaret eder. 10 elemanlı ilk dizi artık işaretçisi olmadığı için stack bellekten silinir.
 
2. satır: dizi referansı artık 4 elemanlı yeni bir diziyi işaret eder. 10 elemanlı ilk dizi artık işaretçisi olmadığı için stack bellekten silinir.
"int[] dizi" stack bellektedir ama işaret ettiği nesne heap bellektedir, yani 2. satırda yeni bir nesne atandığı için stack bellekteki " int[] dizi" silinmez, heap bellekte yeni oluşan "new int[4]" nesnesini işaret etmeye başlar, artık boşa çıkmış olan heap bellekteki "new int[10]" ise garbage collector tarafından silinir diye biliyorum.

Java - stack ve heap memory mevzusunu ben de unutmuş olabilirim, en doğrusunu bilen varsa yardımcı olabilir bize.
 
Artık boşa çıkmış olan heap bellekteki "new int[10]" ise garbage collector tarafından silinir diye biliyorum.
Şimdi işaret ettiği bellek alanları serbest bırakılıyor ya, serbest bırakılan alanlarında sonradan kullanılıyor mu? Yani çöp toplayıcı otomatik olarak yapıyor mu bu işi?
 
"int[] dizi" stack bellektedir ama işaret ettiği nesne heap bellektedir, yani 2. satırda yeni bir nesne atandığı için stack bellekteki " int[] dizi" silinmez, heap bellekte yeni oluşan "new int[4]" nesnesini işaret etmeye başlar, artık boşa çıkmış olan heap bellekteki "new int[10]" ise garbage collector tarafından silinir diye biliyorum.

Java - stack ve heap memory mevzusunu ben de unutmuş olabilirim, en doğrusunu bilen varsa yardımcı olabilir bize.
Nasıl heap belleğe geçtik anlamadım gecenin 2'si olduğundan sanıyorum. Fonksiyon içerisinde stack'da referans oluşturup sonra aynısını var olan nesnede yaptık diye neden heap'a geçtik?
 
Detaylara çok takılma, bilmen gereken tek şey en az bir referans değişkene sahip olmayan bellek adresleri jvm gc tarafından serbest bırakılır.
 
Nasıl heap belleğe geçtik anlamadım gecenin 2'si olduğundan sanıyorum. Fonksiyon içerisinde stack'da referans oluşturup sonra aynısını var olan nesnede yaptık diye neden heap'a geçtik?
Nesne yaratılmazsa, sadece tanımlansa stackte kalıyor, yaratılınca (primitif bir tip değilse) heapte yer açılıyor. "int[] dizi = new int[10];" kodu sadece referans oluşturmuyor, array nesnesi yaratıyor. "int[] dizi;" ya da "int[] dizi = null;" deseydik stackte kalacaktı.

Benim dediğim şeyi şu eleman array değil de "car" nesnesi üzerinden anlatıyor.
Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.
9:51'den 16. dakikaya kadar

Array de primitif tipi kabul edilmediği için heap'te olacak. Şurada da bunu güzelce anlatmışlar.

Şunda da "How Primitive Type Array Objects are stored in Memory?" maddesi altında benzer şeyler var.
 
Stack yönetimi için sormuştum hocam.
Stack üzerinde const veriler tutulur, fonksiyon adresleri ve parametreleri, implemente edilen değişkenler vs. New ile tanımlanan her türlü obje, array ise heap üzerinde tutulur. İnt değişkeni tanımlandıginda stack üzerinde bir int adresi tutacak yer ayrılır, bu compile time da bellidir, run time da ise bu int degisgenine New ile atama yapıldığında tahsis edilen bellek heap üzerinden olur ve stack üzerindeki değişkene heap üzerinde tahsis edilen belleğin ilk adresi yerleştirilir.
 

Geri
Yukarı