Bellek Yönetimi ve GC Ayarlama
JVM bellek yönetimini ve çöp toplamayı derinlemesine inceleyin; Scala'da bellek kullanımını iyileştirme tekniklerini öğrenin.
Bellek Yönetimi ve GC Ayarlama, CoddyKit'te ücretsiz bir Scala for Backend Engineering & Functional Programming dersidir. Bu, 3 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Scala for Backend Engineering & Functional Programming öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Scala for Backend Engineering & Functional Programming kursu toplamda 3 dersten oluşur.
JVM Belleğine ve Çöp Toplamaya Giriş
Hoş geldiniz! Bu derste Java Sanal Makinesi'nin (JVM) belleği nasıl yönettiğini, özellikle de Scala uygulamaları açısından kritik olan yönleriyle inceleyeceğiz.
- Belleği anlamak, verimli ve yüksek performanslı kod yazmanıza yardımcı olur.
- JVM'nin otomatik bellek yöneticisi olan Çöp Toplama'yı (GC) inceleyeceğiz.
- Doğru bellek yönetimi, 'bellek yetersiz' hataları gibi yaygın sorunları önler.
Yığın: Nesne Depolama
Yığın, JVM'deki en büyük bellek alanıdır; Scala uygulamanız tarafından oluşturulan tüm nesneler burada bulunur. Buna sınıf örnekleri, diziler ve çoğu veri yapısı dahildir.
Yığın, uygulamanızdaki tüm iş parçacıkları arasında paylaşılır. Yığının boyutu, programınızın aynı anda kaç nesne tutabileceğini doğrudan etkiler.
Yığın ve Yığın Belleği: Temel Farklar
Yığın nesneleri tutarken Çağrı Yığını, yerel değişkenleri (özellikle ilkel türleri ve nesne başvurularını) ve yöntem çağrısı çerçevelerini depolar. Her iş parçacığının kendine ait bir Çağrı Yığını vardır.
- Yığın: Nesneleri depolar, paylaşılır ve GC tarafından yönetilir.
- Çağrı Yığını: Yöntem çağrılarını ve yerel değişkenleri depolar; iş parçacığına özeldir ve yöntemler girip çıkarken otomatik olarak yönetilir.
Bu ayrımı anlamak, bellek sorunlarını ayıklamak için çok önemlidir.
Çöp Toplamanın Temelleri
Çöp Toplama (GC), uygulama tarafından artık 'erişilebilir' olmayan nesnelerin kullandığı belleği bulup geri kazanan, JVM'nin otomatik işlemidir.
C++'taki gibi belleği elle serbest bırakmak yerine Scala (ve Java), bellek sızıntılarını önlemek ve geliştirmeyi kolaylaştırmak için GC'ye güvenir. Temel fikir 'işaretle ve süpür' yaklaşımıdır: erişilebilir nesneleri işaretleyin, ardından geri kalanları temizleyin.
Nesilsel Çöp Toplama Açıklaması
Modern GC uygulamalarının çoğu nesilsel bir yaklaşım kullanır ve Yığını nesnelerin yaşına göre alanlara ayırır:
- Genç Nesil: Yeni nesnelerin ayrıldığı alandır. Nesnelerin çoğu burada kısa sürede kullanılamaz hâle gelir.
- Yaşlı Nesil: Genç Nesil'de birden fazla GC işleminden sağ çıkan nesneler buraya taşınır.
Bu yaklaşım, Genç Nesil üzerinde daha sık ve hızlı GC işlemlerine (Küçük GC), Yaşlı Nesil üzerinde ise daha seyrek ve yavaş GC işlemlerine (Büyük GC) olanak tanır.
Scala Koleksiyonları ve Bellek
Scala'nın değişmezliğe ve işlevsel programlamaya verdiği önem, özellikle koleksiyon dönüşümleri sırasında çoğu zaman çok sayıda kısa ömürlü nesne oluşturulması anlamına gelir.
GC bunun için optimize edilmiştir. Liste işleme sırasında geçici nesne oluşturulmasına bir örnek görelim:
object Main {
def main(args: Array[String]): Unit = {
println("Creating and transforming a list...")
val originalList = (1 to 100000).toList // ~100k objects
val transformedList = originalList.map(x => x * 2).filter(_ % 3 == 0)
println(s"Transformed list size: ${transformedList.size}")
// originalList and intermediate lists from map are now eligible for GC
println("Intermediate objects are efficiently managed by GC.")
}
}Yaygın Bellek Sızıntısı Senaryoları
GC kullanılsa bile, nesneler güçlü başvurular tarafından istemeden canlı tutulduğunda bellek sızıntıları oluşabilir. Yaygın Scala senaryoları şunlardır:
- Uzun ömürlü önbellekler: Nesneleri genel, değiştirilebilir bir eşlemde süresiz olarak depolamak.
- Kapanışlar: Kapanışın amaçlanan kapsamını aşan büyük bir nesneyi yakalayan kapanış (işlev sabiti).
- Kapatılmamış kaynaklar: Dosya tanıtıcılarını veya ağ bağlantılarını düzgün biçimde kapatmamak.
Önbelleğe Alma için Zayıf Başvurular
Bir nesneye yalnızca önbellek tarafından başvurulduğunda GC'nin belleği geri kazanmasını istediğiniz önbellekler için java.lang.ref.WeakReference kullanın.
WeakReference, başvurduğu nesnenin çöp toplanmasını engellemez. Bir nesneye kalan tek başvurular zayıf başvurularsa nesne GC için uygun hâle gelir.
import java.lang.ref.WeakReference
object Main {
def main(args: Array[String]): Unit = {
var largeData: Array[Byte] = new Array[Byte](1024 * 1024) // 1MB
val weakCacheEntry = new WeakReference(largeData)
println(s"Data exists via weak ref: ${weakCacheEntry.get() != null}")
largeData = null // Remove the strong reference
System.gc() // Hint to the JVM to run GC
Thread.sleep(100) // Give GC time to run
println(s"Data collected (possibly): ${weakCacheEntry.get() == null}")
println("WeakReference allows GC to clean up if no strong references remain.")
}
}Temel GC Ayarlama JVM Bayrakları
GC otomatik olsa da davranışını JVM bağımsız değişkenlerini kullanarak ayarlayabilirsiniz. Temel bayraklar şunlardır:
-Xmx: maksimum Java yığını boyutunu ayarlar (örneğin, 4 gigabayt için-Xmx4g).-Xms: başlangıç Java yığını boyutunu ayarlar (örneğin, 512 megabayt için-Xms512m).-XX:+UseG1GC: Yaygın ve modern bir tercih olan Garbage-First (G1) toplayıcısını belirtir.
Bu bayrakları ayarlamak, uygulama performansını ve bellek kullanımını önemli ölçüde etkileyebilir.
Anladığınızı Kontrol Edin
JVM bellek yönetimi ve Çöp Toplama hakkında aşağıdaki ifadelerden hangileri DOĞRUDUR?
Özet: Bellek ve GC
Harika iş çıkardınız! JVM bellek yönetimi ve Çöp Toplamanın temellerini incelediniz:
- Yığın nesneleri, Çağrı Yığını ise yöntem çağrılarını ve yerel değişkenleri tutar.
- GC, erişilemeyen nesnelerin belleğini otomatik olarak geri kazanır.
- Nesilsel GC'yi (Genç/Yaşlı nesiller) anlamak, performansı optimize etmenize yardımcı olur.
- Bellek sızıntılarına dikkat edin ve belirli önbelleğe alma gereksinimleri için WeakReference gibi araçları kullanın.
-Xmxve-Xmsgibi temel JVM bayrakları, yığın boyutunu denetler.
Sırada, darboğazları belirlemek için profil oluşturma araçlarını ayrıntılı olarak inceleyeceğiz!
Sıkça Sorulan Sorular
“Bellek Yönetimi ve GC Ayarlama” dersi ücretsiz mi?
Evet — “Bellek Yönetimi ve GC Ayarlama” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Scala for Backend Engineering & Functional Programming kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Scala for Backend Engineering & Functional Programming kursu toplamda 3 dersten oluşur.
“Bellek Yönetimi ve GC Ayarlama” dersinde ne öğreneceğim?
JVM bellek yönetimini ve çöp toplamayı derinlemesine inceleyin; Scala'da bellek kullanımını iyileştirme tekniklerini öğrenin. Scala for Backend Engineering & Functional Programming ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Scala for Backend Engineering & Functional Programming öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Scala for Backend Engineering & Functional Programming, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 3 dersinin 2. dersidir.
“Bellek Yönetimi ve GC Ayarlama” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Scala for Backend Engineering & Functional Programming dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Scala for Backend Engineering & Functional Programming dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Scala Uygulamalarının Profilini Çıkarma
- Bellek Yönetimi ve GC Ayarlama
- Eşzamanlı Kodu İyileştirme