Merhaba THS Okurları
Bugün backend dünyasının en sinsi problemlerinden birini konuşuyoruz:Java’da memory leak (bellek sızıntısı)
- Uygulama başta hızlı
- Saatler geçtikçe yavaşlıyor
- RAM doluyor
- CPU yükseliyor
- En sonunda sistem çöküyor
Ve klasik yorum:
“Server yetmiyor galiba…”
Turkhacks ekibi olarak net söylüyoruz:
Sorun çoğu zaman RAM değil, memory leak.
Memory Leak Nedir?
Java’da Garbage Collector (GC) normalde kullanılmayan nesneleri temizler.Ama:
- Eğer referanslar hâlâ tutuluyorsa
- GC o nesneleri silemez
Sonuç:
Memory Leak Belirtileri
RAM Sürekli Artar
- Uygulama boşta bile RAM tüketir
- Zamanla düşmez
GC Süresi Uzar
- Sürekli GC çalışır
- CPU artar
Uygulama Yavaşlar
- Response süreleri artar
- Thread bekler
OutOfMemoryError
En son nokta:
JVM çöker
En Yaygın Memory Leak Sebepleri
Static Koleksiyonlar
static List<User> users = new ArrayList<>();
Temizlenmez → sürekli büyür
Cache Ama Kontrolsüz
- Süresiz cache
- Limit yok
Bellek dolup taşar
Listener / Callback Unutulması
- Event listener kaldırılmaz
- Referans tutulmaya devam eder
ThreadLocal Kullanımı
Yanlış kullanım:
Thread bitse bile veri kalır
Büyük Nesneleri Tutmak
- Büyük listeler
- Büyük map’ler
GC temizleyemez
Sağlıklı Sistem vs Memory Leak
| Durum | Sağlıklı | Memory Leak |
|---|---|---|
| RAM kullanımı | Stabil | Sürekli artar |
| GC davranışı | Normal | Sürekli çalışır |
| Performans | Stabil | Zamanla düşer |
Uptime | Uzun | Çökme olur |
Memory Leak Nasıl Bulunur?
Turkhacks Donanım ekibi olarak kullandığımız yöntemler:
Heap Dump Al
jmap -dump:format=b,file=heap.hprof <pid>
Belleğin fotoğrafını çek
Analiz Araçları Kullan
- Eclipse MAT
- VisualVM
- JProfiler
En çok yer kaplayan nesneleri bul
GC Loglarını İncele
- GC sıklığı artmış mı?
- Full GC çok mu?
Profiling Yap
Hangi obje neden tutuluyor görLeak Nasıl Temizlenir?
✔ Referansları Temizle
- Kullanılmayan objeleri null yap
✔ Cache’e Limit Koy
- LRU cache kullan
- TTL ekle
✔ WeakReference Kullan
WeakReference<User> ref = new WeakReference<>(user);
GC gerektiğinde temizler
✔ ThreadLocal Temizle
threadLocal.remove();
✔ Koleksiyonları Kontrol Et
Sonsuz büyüyen listeleri engelle
En Büyük Yanılgı
“RAM artırırsak çözülür.”Memory leak varsa:
Gerçek Hayat Senaryosu
| Süre | RAM Kullanımı |
|---|---|
| Başlangıç | 1GB |
| 2 saat | 2GB |
| 5 saat | 4GB |
| 8 saat |
Bu klasik leak davranışıdır.
Altın Kural
SONUÇ
Sevgili THS okurları,Memory leak, Java dünyasında en sinsi ve en zor fark edilen problemlerden biridir.
Turkhacks ekibi olarak net söylüyoruz:
✔ RAM artışı çözüm değildir
✔ Referans yönetimi kritik
✔ Profiling yapmadan karar verme
✔ Cache kontrolü şart
Unutmayın:
Bir sonraki teknik rehberde görüşmek üzere. Heap’iniz temiz, uygulamanız stabil olsun
Son düzenleme:



