Hoşgeldin Misafir

Yasar7880

İzmir
1 Mar 2024
848 Mesaj
TIM Görevleri
1

Aktiflik

Seviye

Deneyim

TIM / GÖREV:

maxresdefault.jpg

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ç:

📌 Bellek dolmaya devam eder



Memory Leak Belirtileri


1️⃣ RAM Sürekli Artar

  • Uygulama boşta bile RAM tüketir
  • Zamanla düşmez


2️⃣ GC Süresi Uzar

  • Sürekli GC çalışır
  • CPU artar

3️⃣ Uygulama Yavaşlar

  • Response süreleri artar
  • Thread bekler


4️⃣ OutOfMemoryError


En son nokta:
JVM çöker




En Yaygın Memory Leak Sebepleri


1️⃣ Static Koleksiyonlar


static List<User> users = new ArrayList<>();

Temizlenmez → sürekli büyür



2️⃣ Cache Ama Kontrolsüz

  • Süresiz cache
  • Limit yok

Bellek dolup taşar


3️⃣ Listener / Callback Unutulması

  • Event listener kaldırılmaz
  • Referans tutulmaya devam eder

4️⃣ ThreadLocal Kullanımı


Yanlış kullanım:

Thread bitse bile veri kalır


5️⃣ Büyük Nesneleri Tutmak

  • Büyük listeler
  • Büyük map’ler

GC temizleyemez



Sağlıklı Sistem vs Memory Leak


DurumSağlıklı
Memory Leak
RAM kullanımıStabilSürekli artar
GC davranışıNormalSürekli çalışır
PerformansStabilZamanla düşer
Uptime
UzunÇökme olur



Memory Leak Nasıl Bulunur?

Turkhacks Donanım ekibi olarak kullandığımız yöntemler:


1️⃣ Heap Dump Al


jmap -dump:format=b,file=heap.hprof <pid>
Belleğin fotoğrafını çek


2️⃣ Analiz Araçları Kullan

  • Eclipse MAT
  • VisualVM
  • JProfiler

En çok yer kaplayan nesneleri bul

3️⃣ GC Loglarını İncele

  • GC sıklığı artmış mı?
  • Full GC çok mu?

4️⃣ Profiling Yap

Hangi obje neden tutuluyor gör



Leak 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.”

❌ Yanlış


Memory leak varsa:
👉 Ne kadar RAM verirsen ver, yine dolar.



Gerçek Hayat Senaryosu


Süre
RAM Kullanımı
Başlangıç1GB
2 saat2GB
5 saat4GB
8 saat
💥 Crash

Bu klasik leak davranışıdır.


Altın Kural

👉 “GC temizlemiyorsa bir şey hâlâ tutuluyordur.”


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:
👉 En büyük performans düşmanı görünmeyen hatalardır.


Bir sonraki teknik rehberde görüşmek üzere. Heap’iniz temiz, uygulamanız stabil olsun


9jul8m7.jpeg
 
Son düzenleme: