Bellek Yönetimi Java
⚡ Akıllı Özet
Bellek Yönetimi Java JVM'nin çalışma zamanı belleğini Stack, Heap ve diğer bellek türleri arasında nasıl böldüğünü açıklar. CodeAyrıca, statik bölgeler, metot çağrıları sırasında nesne referanslarının nasıl aktığı ve çöp toplayıcının erişilemeyen nesneleri nasıl geri kazandığı, böylece uygulamaların istikrarlı kalması ve bellek sızıntılarından arınması gibi konuları da ele almaktadır.

Yığın Belleği nedir? Java?
Yığın belleği Java Yığın, her iş parçacığı için metot çerçevelerini, yerel değişkenleri ve referans değişkenlerini depolayan JVM bellek bölgesidir. Yığına her zaman Son Giren İlk Çıkar (LIFO) sırasına göre erişilir, bu nedenle en son çağrılan metot en üstte yer alır ve yerel değişkenleri çerçeveyle birlikte itilir ve çıkarılır.
Her bir iplikçik Java Sanal makine kendi yığınına sahiptir; bu da metot çağrılarını tasarım gereği izole ve iş parçacığı güvenli tutar. int, boolean ve double gibi temel yerel değişkenler doğrudan çerçeve içinde yer alırken, yığında saklanan nesne referansları yığında ayrılan nesnelere işaret eder.
Yığın Bellek (Heap Memory) nedir? Java?
Yığın belleği, her veriyi tutan paylaşılan JVM bölgesidir. Java Yeni operatör ile oluşturulan nesne ve diziler, bu nesnelere ait referans değişkenleriyle birlikte örnek alanlar olarak saklanır. Yığın'ın aksine, yığın tüm iş parçacıkları arasında paylaşılır; bu nedenle nesne erişimi genellikle senkronizasyon gerektirir.
Yığın (Heap), Çöp Toplayıcı'nın yönettiği alandır. Modern HotSpot JVM'ler, yığını kısa ömürlü nesneler için Genç Nesil (Young Generation) ve uzun ömürlü nesneler için Eski Nesil (Old Generation) olmak üzere ikiye ayırır; sınıf meta verileri ise Metaspace adı verilen ayrı bir yerel bölgede saklanır.
Bellek Ayırma Java
Bellek Ayırma Java Bu, JVM'nin program yürütülmesi sırasında değişkenler, sınıf ve yapı örnekleri için sanal bellek bölgeleri ayırma işlemidir. Bellek, nesneye bildirim sırasında tahsis edilmez; yalnızca bir referans oluşturulur. Gerçek nesne tahsisi `new` operatörü aracılığıyla gerçekleşir, bu nedenle her nesne yığında bulunur.
MKS Java Bellek tahsisi aşağıdaki bölümlere ayrılmıştır:
- yığın
- Yığın
- Code
- Statik
Belleğin bu şekilde bölümlenmesi, çalışma zamanının etkili bir şekilde yönetilmesi için gereklidir.
- MKS Code Bu bölüm derlediğiniz bilgileri içerir. baytkodu.
- MKS Yığın bölüm mağazaları yöntemler, yerel değişkenler ve referans değişkenler.
- MKS yığın bölüm içerir nesneler ve ayrıca örnek alanlar olarak tutulan referans değişkenlerini de içerebilir.
- MKS Statik bölüm tutuyor statik veri ve statik yöntemler Tüm örneklerde paylaşılır.
Yerel ve Örnek Değişken arasındaki fark
JVM'de her bir değişken türünün nerede bulunduğunu anlamak, yığın (stack) ve öbek (heap) davranışını açıklamaya yardımcı olur. örnek değişkeni ilan edildi bir sınıfın içinde ancak herhangi bir metodun dışındave nesnenin bir parçası olarak Yığın üzerinde yaşamaya devam ediyor.
class Student{ int num; // num is instance variable public void showData{}
A yerel değişken ilan edildi Bir metodun içinde, metot argümanları da dahil olmak üzereve aktif çerçeve içindeki yığında yer alır.
public void sum(int a){ int x = a + 3; // a, x are local variables }
Yığın ve Yığın Arasındaki Fark
JVM içinde Stack ve Heap farklı sorunları çözer. Stack, her iş parçacığına metot kapsamına bağlı kısa ömürlü veriler için hızlı ve deterministik tahsis sağlarken, Heap ise herhangi bir iş parçacığının referans verebileceği uzun ömürlü nesneler için paylaşılan bir alan sağlar. Aşağıdaki kısa video, takip eden adım adım açıklamadan önce bu iki kavram arasındaki farkı özetlemektedir.
Tıkla okuyun videoya erişilemiyorsa
Stack ve Heap'in nasıl işbirliği yaptığını görmek için, m1 metodunu çağıran bir main metodunu ele alalım.
public void m1{ int x = 20; }
JVM yığınında, m1 metodu için bir çerçeve oluşturulur.
Aşağıdaki resimde gösterildiği gibi, m1'deki x değişkeni de Stack üzerindeki m1 çerçevesinde oluşturulur.
Ardından m1 metodu m2 metodunu çağırır. Yığında, m1'in çerçevesinin üzerine m2 için yeni bir çerçeve oluşturulur.
Yerel değişkenler b ve c de Stack üzerindeki m2 için çerçeve içerisinde oluşturulur.
public void m2(int b){ boolean c; }
Ardından, m2 metodu m3 metodunu çağırır. Yine, aşağıda gösterildiği gibi, yığının en üstünde m3 için bir çerçeve oluşturulur.
Şimdi diyelim ki m3 metodu, iki bileşene sahip Account sınıfı için bir nesne oluşturuyor. örnek değişkenler int p ve int q.
class Account { int p; int q; }
İşte m3 metodunun kodu.
public void m3(){ Account ref = new Account(); // more code }
`new Account()` ifadesi, Heap üzerinde bir Account nesnesi oluşturur.
Referans değişkeni ref, m3 için çerçeve içindeki Stack üzerinde oluşturulur.
Atama operatörü, referans değişkeninin yığındaki nesneye işaret etmesini sağlar.
Metodun yürütülmesi tamamlandıktan sonra, kontrol çağıran metoda, yani bu durumda m2 metoduna geri döner.
m3 metoduna ait çerçeve yığından temizlendi.
Referans değişkeni artık yığındaki nesneyi işaret etmediğinden, o nesne çöp toplama işlemine uygun hale gelir.
m2 metodu tamamlandığında, yığından çıkarılır ve tüm değişkenleri kullanılamaz hale gelir. Aynı durum m1 metodu için de geçerlidir ve sonunda kontrol ana metoda geri döner.
Peki ya bir nesne, örnek değişkeni olarak başka bir referansı tutarsa?
public static void main(String args[]) { A parent = new A(); // more code } class A { B child = new B(); int e; } class B { int c; int d; }
Bu durumda, referans değişkeni olan child, A nesnesinin bir parçası olarak Heap üzerinde yer alır ve aşağıda gösterildiği gibi kendi B nesnesine işaret eder.
Çöp Toplama Nedir? Java?
Çöp Toplama Java JVM'nin bellek yönetimini otomatik olarak gerçekleştirdiği süreçtir. Çöp toplayıcı, artık herhangi bir canlı referanstan erişilemeyen nesneleri bulur ve belleklerini geri kazanır. Dinamik bellek tahsisi, `new` operatörü aracılığıyla gerçekleşir ve bellek, program nesneye herhangi bir referans tutmadığı ana kadar tahsis edilmiş olarak kalır.
Hiçbir referans kalmadığında, nesnenin artık gerekli olmadığı kabul edilir ve kapladığı bellek geri kazanılabilir. Bir nesneyi yok etmek için açık bir gereklilik yoktur çünkü Java Atık toplama işlemi, çöp toplama mekanizması aracılığıyla otomatik olarak gerçekleştirilir.
Bunun ardındaki teknik şu şekilde bilinir: Çöp toplamaBelleği serbest bırakmayı başaramayan programlar, tahsis edilecek hiçbir şey kalmadığında sonunda çöker. Bu tür programlara bellek yetersizliğinden kaynaklanan sorunlar denir. bellek sızıntıları. Çöp Toplama Java otomatik olarak çalışır Programın ömrü boyunca, manuel tahsisat kaldırma yükünü ortadan kaldırır ve sızıntı riskini azaltır.
C dilinde ise bunun aksine, programcı free() fonksiyonu aracılığıyla dinamik olarak ayrılan belleği serbest bırakmaktan sorumludur. İşte bu noktada devreye giriyor. Java Bellek yönetimi önemli bir avantaj sunuyor.
Modern HotSpot JVM'ler, farklı iş yükleri için optimize edilmiş çeşitli Çöp Toplayıcılar (Garbage Collector) içerir. Varsayılan G1 Çöp Toplayıcı, çok gigabaytlık yığınlarda dengeli verim ve duraklama sürelerini hedefler. ZGC ve Shenandoah ise çok büyük yığınlarda milisaniyenin altında duraklama süreleri hedefleyerek, bu özellikleri en üst seviyeye çıkarır.tracGecikmeye duyarlı hizmetler için idealdir. Doğru toplayıcıyı seçmek ve Genç Nesil, Eski Nesil ve Metaspace boyutlarını ayarlamak temel bir beceridir. Java Performans çalışması.
Not: Tüm nesneler, çöp toplayıcının yönettiği bellek alanı olan yığın (Heap) bölümünde oluşturulur.
Örnek: Çöp Toplama Mekanizmasını Öğrenmek Java
Bu kılavuz, basit bir programda referansların ne zaman çöp toplama işlemine uygun hale geldiğini göstermektedir.
) 1 Adım Aşağıdaki kodu bir editöre kopyalayın.
class Student{ int a; int b; public void setData(int c,int d){ a=c; b=d; } public void showData(){ System.out.println("Value of a = "+a); System.out.println("Value of b = "+b); } public static void main(String args[]){ Student s1 = new Student(); Student s2 = new Student(); s1.setData(1,2); s2.setData(3,4); s1.showData(); s2.showData(); //Student s3; //s3=s2; //s3.showData(); //s2=null; //s3.showData(); //s3=null; //s3.showData(); } }
) 2 Adım Kodu kaydedin, derleyin ve çalıştırın. Şemada gösterildiği gibi, iki nesne ve iki referans değişkeni oluşturulur.
) 3 Adım 20, 21 ve 22. satırların yorum satırlarını kaldırın. Kodu kaydedin, derleyin ve çalıştırın.
) 4 Adım Aşağıdaki şemada gösterildiği gibi, iki referans değişkeni artık aynı nesneye işaret etmektedir.
) 5 Adım 23. ve 24. satırların yorum satırlarını kaldırın. Kodu kaydedin, derleyin ve çalıştırın.
) 6 Adım Aşağıda gösterildiği gibi, s2 boş değer alır, ancak s3 hala nesneye işaret eder, bu nedenle nesne henüz Çöp Toplama için uygun değildir.
) 7 Adım 25. ve 26. satırların yorum satırlarını kaldırın. Kodu kaydedin, derleyin ve çalıştırın.
) 8 Adım Bu aşamada, nesneye işaret eden hiçbir referans kalmadığı için çöp toplama işlemine tabi tutulmaya uygun hale gelir. Çöp toplayıcı onu bellekten kaldırır ve geri alma imkanı kalmaz.
Bir nesneyi nasıl silerim? Java?
Java Manuel silme operatörü sağlamadığından, standart yaklaşım, çöp toplayıcının onu geri kazanabilmesi için nesneye yapılan tüm referansları kaldırmaktır.
1) Bir nesneyi çöp toplama işlemine uygun hale getirmek için, o nesneye işaret eden tüm referans değişkenlerine null değeri atayın.
2) Temel veri tipleri nesne değildir, bu nedenle onlara null değeri atanamaz. Çevreleyen yığın çerçevesi kaldırıldığında depolama alanları otomatik olarak geri kazanılır.


















