Java'da bellek yönetimi, Bellek yönetimi adı verilen nesnelerin tahsis edilmesi ve tahsisinin kaldırılması işlemidir. Java, bellek yönetimini otomatik olarak yapar. Java, adı verilen otomatik bir bellek yönetim sistemi kullanır. Çöp toplayıcı . Bu nedenle uygulamamızda bellek yönetimi mantığını uygulamamıza gerek yoktur. Java bellek yönetimi iki ana bölüme ayrılır:
JVM Bellek Yapısı
JVM, bir yığında çeşitli çalışma zamanı veri alanları oluşturur. Bu alanlar programın yürütülmesi sırasında kullanılır. JVM çıktığında bellek alanları yok edilirken, iş parçacığı çıktığında veri alanları yok edilir.
Yöntem Alanı
Yöntem Alanı, tüm iş parçacıkları arasında paylaşılan yığın belleğinin bir parçasıdır. JVM başlatıldığında oluşturulur. Sınıf yapısını, üst sınıf adını, arayüz adını ve yapıcıları depolamak için kullanılır. JVM, yöntem alanında aşağıdaki türde bilgileri saklar:
- Bir türün tam nitelikli adı (örneğin: String)
- Türün değiştiricileri
- Türün doğrudan üst sınıf adı
- Süper arayüzlerin tam nitelikli adlarının yapılandırılmış bir listesi.
Yığın Alanı
Heap gerçek nesneleri saklar. JVM başlatıldığında oluşturulur. Gerektiğinde kullanıcı yığını kontrol edebilir. Sabit veya dinamik boyutta olabilir. Yeni bir anahtar kelime kullandığınızda JVM, bir yığındaki nesne için bir örnek oluşturur. Bu nesnenin referansı yığında depolanırken. Çalışan her JVM işlemi için yalnızca bir yığın vardır. Yığın dolduğunda çöpler toplanır. Örneğin:
StringBuilder sb= new StringBuilder();
Yukarıdaki ifade StringBuilder sınıfının bir nesnesini oluşturur. Nesne yığına tahsis edilir ve referans sb de yığına tahsis edilir. Yığın aşağıdaki bölümlere ayrılmıştır:
ücretsiz ipconfig
- Genç nesil
- Hayatta kalan alanı
- Eski nesil
- Kalıcı nesil
- Kod Önbelleği
Referans Türü
Dört tür referans vardır: Güçlü , Zayıf , Yumuşak , Ve Hayalet referans . Referans türleri arasındaki fark, referans verdikleri yığındaki nesnelerin farklı kriterler altında çöp toplamaya uygun olmasıdır.
Güçlü referans: Günlük programlamamızda kullandığımız için çok basittir. Kendisine Güçlü referans eklenmiş herhangi bir nesne çöp toplamaya uygun değildir. Aşağıdaki ifadeyi kullanarak güçlü bir referans oluşturabiliriz:
StringBuilder sb= new StringBuilder();
Zayıf Referans: Bir sonraki çöp toplama işleminden sonra hayatta kalmaz. Verilerin ne zaman tekrar isteneceğinden emin değilsek. Bu durumda ona zayıf bir referans oluşturabiliriz. Çöp toplayıcının işlem yapması durumunda nesneyi yok eder. Tekrar o nesneyi almaya çalıştığımızda null değeri alıyoruz. Tanımlanmıştır java.lang.ref.WeakReference sınıf. Aşağıdaki ifadeyi kullanarak zayıf bir referans oluşturabiliriz:
WeakReference reference = new WeakReference(new StringBuilder());
Yumuşak Referans: Uygulamanın belleği azaldığında toplanır. Çöp toplayıcı yumuşakça ulaşılabilen nesneleri toplamaz. Yazılımla referans verilen tüm nesneler, bir OutOfMemoryError atmadan önce toplanır. Aşağıdaki ifadeyi kullanarak yumuşak bir referans oluşturabiliriz:
SoftReference reference = new SoftReference(new StringBuilder());
Hayalet Referansı: Şurada mevcuttur: java.lang.ref paket. Tanımlanmıştır java.lang.ref.PhantomReference sınıf. Yalnızca hayalet referansı işaret eden nesne, çöp toplayıcının toplamak istediği zaman toplanabilir. Aşağıdaki ifadeyi kullanarak hayali bir referans oluşturabiliriz:
PhantomReference reference = new PhantomReference(new StringBuilder());
Yığın Alanı
Yığın Alanı, bir iş parçacığı oluşturulduğunda oluşturulur. Sabit veya dinamik boyutta olabilir. Yığın belleği iş parçacığı başına tahsis edilir. Verileri ve kısmi sonuçları depolamak için kullanılır. Yığın nesnelerine referanslar içerir. Ayrıca yığındaki bir nesneye referans yerine değerin kendisini de tutar. Yığında saklanan değişkenlerin kapsam adı verilen belirli bir görünürlüğü vardır.
Java'da kuyruk ve öncelik kuyruğu
Yığın Çerçevesi: Yığın çerçevesi, iş parçacığının verilerini içeren bir veri yapısıdır. İş parçacığı verileri, geçerli yöntemdeki iş parçacığının durumunu temsil eder.
- Kısmi sonuçları ve verileri depolamak için kullanılır. Ayrıca dinamik bağlantı, yöntemlere göre değerlerin döndürülmesi ve istisnaların gönderilmesi işlemlerini de gerçekleştirir.
- Bir yöntem çağrıldığında yeni bir çerçeve oluşturulur. Yöntemin çağrılması tamamlandığında çerçeveyi yok eder.
- Her çerçeve kendi Yerel Değişken Dizisini (LVA), İşlenen Yığınını (OS) ve Çerçeve Verilerini (FD) içerir.
- Derleme zamanında belirlenen LVA, OS ve FD boyutları.
- Belirli bir kontrol iş parçacığında herhangi bir noktada yalnızca bir çerçeve (yöntemin yürütülmesine yönelik çerçeve) etkindir. Bu çerçeveye geçerli çerçeve adı verilir ve yöntemine geçerli yöntem denir. Yöntemin sınıfına geçerli sınıf denir.
- Çerçeve, yöntemi başka bir yöntemi çağırırsa veya yöntem tamamlanırsa geçerli yöntemi durdurur.
- Bir iş parçacığı tarafından oluşturulan çerçeve, o iş parçacığına yereldir ve başka bir iş parçacığı tarafından referans alınamaz.
Yerel Yöntem Yığını
C yığını olarak da bilinir. Java dışında bir dilde yazılmış yerel kod için bir yığındır. Java Yerel Arayüzü (JNI), yerel yığını çağırır. Yerel yığının performansı işletim sistemine bağlıdır.
pandalar sıra sıraları
PC Kayıtları
Her iş parçacığının kendisiyle ilişkilendirilmiş bir Program Sayacı (PC) kaydı vardır. PC kaydı dönüş adresini veya yerel işaretçiyi saklar. Ayrıca o anda yürütülmekte olan JVM talimatlarının adresini de içerir.
Çöp Toplayıcının Çalışması
Çöp Toplayıcıya Genel Bakış
Bir program Java'da çalıştırıldığında belleği farklı şekillerde kullanır. Yığın, nesnelerin yaşadığı hafızanın bir parçasıdır. Bu, hafızanın çöp toplama sürecine dahil olan tek kısmıdır. Çöp toplama yığını olarak da bilinir. Tüm çöp toplama, yığının mümkün olduğunca fazla boş alana sahip olmasını sağlar. Çöp toplayıcının görevi ulaşılamayan nesneleri bulup silmektir.
Nesne Tahsisi
Bir nesne tahsis edildiğinde JRockit JVM, nesnenin boyutunu kontrol eder. Küçük ve büyük nesneleri birbirinden ayırır. Küçük ve büyük boyut, JVM sürümüne, yığın boyutuna, çöp toplama stratejisine ve kullanılan platforma bağlıdır. Bir nesnenin boyutu genellikle 2 ila 128 KB arasındadır.
Küçük nesneler, yığının serbest bir parçası olan İş Parçacığı Yerel Alanında (TLA) depolanır. TLA diğer iş parçacıklarıyla senkronize edilmez. TLA dolduğunda yeni TLA talebinde bulunur.
Öte yandan TLA'nın içine sığmayan büyük nesneler doğrudan yığına tahsis edilir. Bir iş parçacığı genç alanı kullanıyorsa doğrudan eski alanda depolanır. Büyük nesne, iş parçacıkları arasında daha fazla senkronizasyon gerektirir.
Java Çöp Toplayıcı ne işe yarar?
JVM çöp toplayıcıyı kontrol eder. Çöp toplama işleminin ne zaman gerçekleştirileceğine JVM karar verir. Ayrıca JVM'den çöp toplayıcıyı çalıştırmasını da talep edebiliriz. Ancak JVM'nin hiçbir koşulda uyacağına dair bir garanti yoktur. JVM, belleğin azaldığını algılarsa çöp toplayıcıyı çalıştırır. Java programı çöp toplayıcı için istekte bulunduğunda, JVM genellikle isteği kısa sürede kabul eder. İsteklerin kabul edildiğinden emin değildir.
Anlaşılması gereken nokta şu:' Bir nesne ne zaman çöp toplamaya uygun hale gelir? '
Her Java programında birden fazla iş parçacığı bulunur. Her iş parçacığının kendi yürütme yığını vardır. Java programında çalıştırılacak bir main() yöntemi olan bir iş parçacığı vardır. Artık bir nesnenin hiçbir canlı iş parçacığının erişemediği durumlarda çöp toplamaya uygun olduğunu söyleyebiliriz. Çöp toplayıcı bu nesneyi silinmeye uygun olarak değerlendirir. Bir programın bir nesneye atıfta bulunan bir referans değişkeni varsa, bu referans değişkeni canlı iş parçacığı için kullanılabilir, bu nesneye denir. ulaşılabilir .
Burada şöyle bir soru ortaya çıkıyor: Bir Java uygulamasının belleği yetersiz kalabilir mi? '
Cevap Evet. Çöp toplama sistemi, nesneler kullanılmadığında bellekten silinmeye çalışılır. Ancak çok sayıda canlı nesnenin bakımını yapıyorsanız çöp toplama işlemi yeterli hafızanın olduğunu garanti etmez. Yalnızca kullanılabilir bellek etkili bir şekilde yönetilecektir.
Java karakterini int'ye çevirme
Çöp Toplama Türleri
Beş tür çöp toplama vardır:
İşaretleme ve Süpürme Algoritması
JRockit JVM, çöp toplama işlemini gerçekleştirmek için işaretleme ve tarama algoritmasını kullanır. İşaretleme aşaması ve tarama aşaması olmak üzere iki aşamadan oluşur.
İşaretleme Aşaması: İş parçacıklarından, yerel tanıtıcılardan ve diğer GC kök kaynaklarından erişilebilen nesneler canlı olarak işaretlenir. Her nesne ağacının birden fazla kök nesnesi vardır. GC köküne her zaman ulaşılabilir. Yani kökünde çöp toplama kökü olan herhangi bir nesne. Kullanımda olan tüm nesneleri tanımlar ve işaretler, geri kalanlar ise çöp olarak kabul edilebilir.
Süpürme Aşaması: Bu aşamada, canlı nesneler arasındaki boşluğu bulmak için yığının içinden geçilir. Bu boşluklar ücretsiz listeye kaydedilir ve yeni nesne tahsisi için kullanılabilir.
İşaretleme ve süpürmenin geliştirilmiş iki versiyonu vardır:
Java vaka bildirimi
Eşzamanlı İşaretleme ve Süpürme
Çöp toplamanın büyük bir kısmı sırasında iş parçacıklarının çalışmaya devam etmesini sağlar. Aşağıdaki işaretleme türleri vardır:
Paralel İşaretleme ve Süpürme
Çöp toplama işlemini mümkün olduğu kadar hızlı gerçekleştirmek için sistemdeki tüm mevcut CPU'ları kullanır. Paralel çöp toplayıcı olarak da adlandırılır. Paralel çöp toplama işlemi yürütüldüğünde iş parçacıkları yürütülmez.
Mark ve Sweep'in Artıları
- Bu yinelenen bir süreçtir.
- Bu sonsuz bir döngüdür.
- Bir algoritmanın yürütülmesi sırasında ek yüke izin verilmez.
Mark ve Sweep'in Eksileri
- Çöp toplama algoritması çalışırken normal program yürütmesini durdurur.
- Bir programda birden çok kez çalışır.