Memory Leaks ve OOM (Out of Memory) Hataları
Sorunun Belirtileri
uyarı
Memory leak ve OOM hataları genellikle aşağıdaki belirtilerle kendini gösterir:
- Pod'ların sürekli yeniden başlatılması
OutOfMemoryErrorlog kayıtları- Yavaş artan bellek kullanımı
- Sistem performansında düşüş
- Kubernetes'te pod'ların
OOMKilleddurumuna geçmesi
Sorunun Nedenleri
Memory leak ve OOM hataları genellikle şu faktörlerden kaynaklanabilir:
- Yetersiz Heap Ayarları: JVM heap boyutu yetersiz olabilir
- Memory Leak'ler: Kullanılmayan nesnelerin garbage collection tarafından temizlenmemesi
- Büyük Veri İşlemleri: Büyük mesaj gövdelerinin işlenmesi
- Cache Boyutları: Cache'in sınırsız büyümesi
- Connection Pool Sorunları: Kapatılmayan bağlantılar
- Thread Pool Sorunları: Thread'lerin düzgün temizlenmemesi
Tespit Yöntemleri
1. Log Analizi
OOM hatalarını log dosyalarında arayın:
kubectl logs <pod-name> | grep -i "OutOfMemoryError"
kubectl logs <pod-name> | grep -i "java.lang.OutOfMemoryError"
2. Memory Metrikleri İzleme
Prometheus metrikleri ile bellek kullanımını izleyin:
jvm_memory_used_bytesjvm_memory_max_bytescontainer_memory_usage_bytes
3. Heap Dump Analizi
Heap Dump Al
Heap dump alarak memory leak'leri tespit edin:
# Heap dump alma
kubectl exec <pod-name> -- jmap -dump:format=b,file=/tmp/heapdump.hprof <pid>
# Heap dump'ı pod'dan kopyalama
kubectl cp <namespace>/<pod-name>:/tmp/heapdump.hprof ./heapdump.hprof
Çözüm Önerileri
1. JVM Heap Ayarlarını Optimize Etme
bilgi
Pod deployment'ında JVM parametrelerini ayarlayın:
env:
- name: JAVA_OPTS
value: "-Xms2g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
not
Öneriler:
- Apinizer'ın otomatik bellek profili, container belleğine göre uygun GC ve heap yüzdesini seçer (≤768 MB'da Serial GC, 769-1536 MB'da G1GC, >1536 MB'da ZGC)
- 1536 MB'ın üzerindeki container'larda ZGC otomatik seçilir ve %70 heap kullanır — sub-millisecond GC duraklamaları sağlar
- Manuel yapılandırma tercih ediyorsanız, tahmin edilebilir duraklama süreleri için G1GC ile MaxGCPauseMillis kullanın
- Detaylı GC yapılandırma seçenekleri için JVM Garbage Collector Ayarlama sayfasına bakın
2. Memory Limit'lerini Artırma
Kubernetes deployment'ında memory limit'lerini artırın:
resources:
limits:
memory: "4Gi"
requests:
memory: "2Gi"
3. Cache Yapılandırmasını Optimize Etme
Cache TTL ve boyut limitlerini ayarlayın:
- Cache TTL değerlerini optimize edin
- Cache boyut limitlerini belirleyin
- Gereksiz cache entry'lerini temizleyin
4. Connection Pool Ayarlarını Optimize Etme
Connection pool ayarlarını kontrol edin:
- Maksimum connection sayısını sınırlayın
- Connection timeout değerlerini ayarlayın
- Idle connection'ları düzenli olarak temizleyin
5. Thread Pool Yönetimi
Thread pool ayarlarını optimize edin:
- Maksimum thread sayısını sınırlayın
- Thread timeout değerlerini ayarlayın
- Thread'lerin düzgün temizlendiğinden emin olun
6. Büyük Mesaj İşlemelerini Optimize Etme
Büyük mesaj gövdelerini işlerken:
- Streaming kullanın
- Mesaj boyut limitlerini belirleyin
- Gereksiz veri kopyalamalarından kaçının
Önleyici Tedbirler
1. Düzenli İzleme
- Memory kullanımını düzenli olarak izleyin
- Alert'ler kurarak erken uyarı alın
- Trend analizi yaparak sorunları önceden tespit edin
2. Load Testing
- Düzenli load test'ler yapın
- Memory leak'leri erken tespit edin
- Kapasite planlaması yapın
3. Code Review
- Memory leak'lere neden olabilecek kodları gözden geçirin
- Resource management'ı kontrol edin
- Best practice'lere uyun