Java Memory Leaks: Heap Dump ile Bulma ve Çözme

# Java Memory Leaks: Heap Dump ile Bulma ve Çözme

Memory leak, uygulamanın kullanmadığı nesneleri bellekten temizleyememesidir. Zamanla heap dolup uygulama yavaşlar veya çöker. Bunu bulmak için heap dump analizi yapmalısın.

Heap dump, belirli bir andaki JVM belleğinin (heap) tam bir görüntüsüdür. İçinde tüm nesneler, referansları ve bellekte ne kadar yer kapladıkları vardır.

Çalışan Java uygulamasından heap dump almak için önce process ID'sini bul:

1jps -l

Çıktıda uygulamanın PID'ini gör. Sonra dump dosyasını oluştur:

1jmap -dump:live,format=b,file=dump.hprof <PID>

Bu komut `dump.hprof` dosyasını oluşturur.

memory leak'e neden olan bir örnek:

[kod]
import java.util.ArrayList;
import java.util.List;

public class MemoryLeakExample {
private static List<String> cache = new ArrayList<>();

public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 1000000; i++) {
cache.add("Data " + i);
if (i % 100000 == 0) {
System.out.println("Added " + i + " items");
Thread.sleep(500);
}
}
}
}
[/cod]

Burada `cache` list'i hiçbir zaman temizlenmiyor. Statik olduğu için uygulama kapanana kadar bellekte kalıyor.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

Dump dosyasını Eclipse Memory Analyzer (MAT) ile aç:

1. Eclipse MAT'ı indir
2. `dump.hprof` dosyasını aç
3. "Leak Suspects" raporunu kontrol et
4. Büyük nesneleri gösteren grafiği incele

MAT, hangi nesnelerin bellekte tutulduğunu ve neden tutulduğunu gösterir.

Üstteki kodu düzelt:

[kod]
import java.util.ArrayList;
import java.util.List;

public class MemoryLeakFixed {
private static final int MAX_CACHE_SIZE = 1000;
private static List<String> cache = new ArrayList<>();

public static void addToCache(String data) {
if (cache.size() >= MAX_CACHE_SIZE) {
cache.remove(0); // Eski öğeyi sil
}
cache.add(data);
}

public static void main(String[] args) {
for (int i = 0; i < 1000000; i++) {
addToCache("Data " + i);
if (i % 100000 == 0) {
System.out.println("Added " + i + " items");
}
}
}
}
[/cod]

Şimdi cache'in boyutu sınırlı. Eski veriler silinir.

- WeakHashMap veya SoftReference kullan; nesneler gerekirse otomatik temizlenir
- Listener/Observer pattern'de kaydı iptal et
- Veritabanı bağlantılarını her zaman kapat (try-with-resources kullan)
- Büyük koleksiyonları null'a set et, kullanmayacaksan

Heap dump analizi başta zor görünse de pratik yapınca JVM belleğini anlamak çok kolaylaşır.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz