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?
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.
"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.
Ş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?
Ş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?
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.
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.
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.