Bellek Sızıntılarını Algılama ve Düzeltme
Yaygın bellek sızıntısı kalıplarını (statik koleksiyonlar, dinleyiciler, önbellekler) belirleyin ve düzeltin.
Bellek Sızıntılarını Algılama ve Düzeltme, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 3. 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, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.
Java'da Bellek Sızıntısı Nedir
Java'da bellek sızıntısı, artık gerekmeyen nesnelerin güçlü biçimde erişilebilir durumda kalması ve çöp toplamanın bu nesnelerin belleğini geri kazanmasını engellemesiyle oluşur. Öbek, OutOfMemoryError fırlatılana kadar büyür.
Statik Koleksiyon Birikimi
Büyüyen bir koleksiyonu tutan statik alan, klasik bir sızıntı örneğidir. Eklenen ancak hiç kaldırılmayan nesneler, uygulamanın ömrü boyunca canlı kalır.
public class Cache {
// LEAK: static list grows forever if items are never removed
private static final List<Object> items = new ArrayList<>();
public static void add(Object o) { items.add(o); }
// Fix: add a remove() method or use a bounded cache
}Kayıtları Kaldırılmamış Olay Dinleyicileri
Bir dinleyiciyi hiç kaldırmadan kaydetmek, hem dinleyiciyi hem de başvurduğu nesneleri canlı tutar. Artık gerekmeyen dinleyicilerin kayıtlarını her zaman kaldırın.
// Leak:
sensor.addListener(new DataLogger());
// Fix:
DataLogger logger = new DataLogger();
sensor.addListener(logger);
// ... when done:
sensor.removeListener(logger);Temizlenmeyen ThreadLocal Değişkenleri
İş parçacığı havuzlarında, iş parçacıkları yeniden kullanıldığı için ThreadLocal değerleri görevler arasında yaşamaya devam eder. Temizlenmezse bir görevin verileri aynı iş parçacığındaki sonraki görevlere sızar.
private static final ThreadLocal<MyContext> CTX = new ThreadLocal<>();
// Always clean up after each task:
try {
CTX.set(new MyContext(requestId));
doWork();
} finally {
CTX.remove(); // prevents leak in pooled threads
}Çalışırken Dağıtılan Uygulamalarda Sınıf Yükleyici Sızıntıları
Servlet kapsayıcılarında her dağıtım yeni bir sınıf yükleyici kullanır. Herhangi bir sınıf eski sınıf yükleyicideki bir sınıfa statik başvuru tutarsa eski sınıf yükleyicinin tamamı (ve tüm sınıfları) çöp toplama işleminden geçirilemez.
Yığın Dökümleriyle Sızıntıları Tespit Etme
jmap -dump:format=b,file=heap.hprof <pid> komutuyla bir yığın dökümü alın, ardından en büyük bellekte tutulan nesneleri ve bunların çöp toplayıcı köklerini bulmak için dosyayı Eclipse MAT veya VisualVM'de açın.
// Take a heap dump:
jmap -dump:live,format=b,file=heap.hprof $(jps | grep MyApp | cut -d" " -f1)
// Or trigger on OOM:
// -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heap.hprofEclipse Bellek Analiz Aracı (MAT)
MAT'in "Sızıntı Şüphelileri" raporu, bellekte büyük yer tutan nesneleri otomatik olarak belirler ve çöp toplayıcı köklerinden başlayan yolu gösterir. En büyük sorun kaynaklarını bulmak için "Baskınlık Ağacı" görünümüyle başlayın.
Sızıntıları Önlemek için WeakReference Kullanma
Önbelleğe alınan veya dinleyici nesnelerini WeakReference içine sarın. Bellek baskısı altında çöp toplayıcı bunları geri alabilir. get() sonucunun null olup olmadığını her zaman kontrol edin.
Map<String, WeakReference<Image>> imageCache = new HashMap<>();
imageCache.put("logo", new WeakReference<>(loadImage("logo.png")));
Image logo = imageCache.get("logo") != null ? imageCache.get("logo").get() : null;
if (logo == null) logo = reload("logo.png"); // re-load if GCedLinkedHashMap LRU ile Sınırlandırılmış Önbellekler
Önbellek boyutunu sınırlamak ve en uzun süredir kullanılmayan girdiyi otomatik olarak çıkarmak için bir LinkedHashMap içinde removeEldestEntry yöntemini geçersiz kılın.
Map<String, String> lruCache = new LinkedHashMap<>(16, 0.75f, true) {
protected boolean removeEldestEntry(Map.Entry<String, String> e) {
return size() > 100; // evict when over 100 entries
}
};Java Flight Recorder ile Ayırmaları Profilleme
JFR (Java Flight Recorder), çok düşük ek yükle bellek ayırma profillerini yakalar. -XX:StartFlightRecording ile etkinleştirin ve JDK Mission Control ile analiz edin.
// Start a 60-second JFR recording:
java -XX:StartFlightRecording=duration=60s,filename=rec.jfr MyApp
// Or via jcmd:
jcmd <pid> JFR.start duration=60s filename=rec.jfrSızıntıları Düzeltme: Kontrol Listesi
Şunları kontrol edin: static koleksiyonlar, kaydı kaldırılmamış dinleyiciler, havuzlardaki ThreadLocals, bağlantı/akış sızıntıları (try-with-resources kullanın), dış nesnelere başvuran iç sınıflar ve çıkarma işlemi olmayan önbellekler.
Kısa Sınama
OutOfMemoryError fırlatıldığında yığını otomatik olarak döken JVM bayrağı hangisidir?
Özet
Yaygın Java sızıntısı kaynakları şunlardır: static koleksiyonlar, kaydı kaldırılmamış dinleyiciler, havuzlanmış ThreadLocals ve sınırsız önbellekler. Bunları yığın dökümleri ve MAT ile tespit edin. WeakReferences, sınırlandırılmış veri yapıları kullanarak ve işiniz bittiğinde başvuruları her zaman kaldırarak düzeltin.
Sıkça Sorulan Sorular
“Bellek Sızıntılarını Algılama ve Düzeltme” dersi ücretsiz mi?
Evet — “Bellek Sızıntılarını Algılama ve Düzeltme” 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 Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.
“Bellek Sızıntılarını Algılama ve Düzeltme” dersinde ne öğreneceğim?
Yaygın bellek sızıntısı kalıplarını (statik koleksiyonlar, dinleyiciler, önbellekler) belirleyin ve düzeltin. Java Academy 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.
Java Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Java Academy, 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, 4 dersinin 3. dersidir.
“Bellek Sızıntılarını Algılama ve Düzeltme” 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 Java Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Java Academy 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
- JVM Yığın Bölgeleri ve Nesne Yaşam Döngüsü
- GC Algoritmaları: Serial, G1, ZGC, Shenandoah
- Bellek Sızıntılarını Algılama ve Düzeltme
- GC Ayarlama Bayrakları ve JVisualVM Profillemesi