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.


















