logo

Java'da Bellek Yönetimi

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ı Çöp Toplayıcının Çalışması

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.

Java'da Bellek Yönetimi

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:

    Seri GC:Genç ve yaşlı nesiller için küçük ve büyük GC olan işaretle ve süpür yaklaşımını kullanır.Paralel GC:Seri GC'ye benzer, tek farkı genç nesil çöp toplama için N (sistemdeki CPU çekirdeği sayısı) iş parçacığı üretmesidir.Paralel Eski GC:Her iki nesil için birden fazla iş parçacığı kullanması dışında paralel GC'ye benzer.Eşzamanlı İşaretleme Süpürme (CMS) Toplayıcı:Eski nesil için çöp toplama işlemini yapar. CMS toplayıcıdaki iş parçacığı sayısını aşağıdakileri kullanarak sınırlayabilirsiniz: XX:ParalleCMSThreads=JVM seçeneği . Aynı zamanda Eşzamanlı Düşük Duraklatma Toplayıcı olarak da bilinir.G1 Çöp Toplayıcı:Java 7'de tanıtıldı. Amacı CMS toplayıcının yerini almaktır. Paralel, eşzamanlı ve CMS toplayıcıdır. Genç ve yaşlı kuşak alanı yok. Yığını birkaç eşit büyüklükte yığına böler. İlk önce daha az canlı veriye sahip bölgeleri toplar.

İş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.

Java'da Bellek Yönetimi

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 Paralel İşaretleme ve Süpürme

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:

    İlk işaretleme:Canlı nesnelerin kök kümesini tanımlar. İş parçacıkları duraklatıldığında yapılır.Eşzamanlı işaretleme:Bu işaretlemede kök kümeden gelen referanslar takip edilir. Bir yığındaki canlı nesnelerin geri kalanını bulur ve işaretler. İş parçacığı çalışırken yapılır.Ön temizleme işareti:Eş zamanlı işaretleme ile yapılan değişiklikleri tanımlar. İşaretlenen ve bulunan diğer canlı nesneler. İş parçacığı çalışırken yapılır.Son işaretleme:Ön temizleme işaretlemesi ile yapılan değişiklikleri tanımlar. İşaretlenen ve bulunan diğer canlı nesneler. İş parçacıkları duraklatıldığında yapılı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.