Ana içeriğe geç

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ı
  • OutOfMemoryError log kayıtları
  • Yavaş artan bellek kullanımı
  • Sistem performansında düşüş
  • Kubernetes'te pod'ların OOMKilled durumuna 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
  • Metaspace Tavanı: Container bellek limitine göre belirlenen Metaspace üst sınırının dolması (özellikle OpenTelemetry Java agent kullanılan düşük bellekli Worker'larda)

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_bytes
  • jvm_memory_max_bytes
  • container_memory_usage_bytes

3. Heap ve Thread Dump Analizi​

Apinizer imajları JRE tabanlıdır (Eclipse Temurin 25 JRE); jmap, jstack gibi JDK araçları container içinde bulunmaz. Heap ve thread dump'ları Worker ve Cache'in diagnostics endpoint'leri (/apinizer/diagnostics/heapdump, /apinizer/diagnostics/threaddump) üzerinden alınır. Heap dump yalnızca isteğin ulaştığı pod'dan alınır, diğer pod'lara dağıtılmaz.

Komut örnekleri ve yetkilendirme ayrıntıları için Diagnostic Endpoint Adresleri sayfasına bakın.

Çözüm Önerileri​

1. JVM Heap Ayarlarını Optimize Etme​

Apinizer modülleri container bellek limitine göre heap, direct memory ve metaspace değerlerini otomatik belirler (1 GB'lık kademeler).

not

Öneriler:

  • Varsayılan olarak Worker, Manager, Integration ve Portal G1GC; Cache ise 2 GB ve üzerinde ZGC kullanır. Worker heap'i bellek kademesine göre %50–65 arasındadır.
  • JAVA_OPTS içinde kademenin de belirlediği -XX:MaxRAMPercentage gibi ayarlar, jvmOverride=true tanımlanmadıkça uygulanmaz; kademe değerleri geçerli olur.
  • Kendi heap değerinizi kullanmanız gerekiyorsa jvmOverride=true ile birlikte verin. ZGC seçildiğinde %70'in üzerindeki MaxRAMPercentage değerleri otomatik olarak %70'e düşürülür (Cache hariç).
  • Detaylı kademe tabloları ve GC seçenekleri için JVM Garbage Collector Ayarlama sayfasına bakın.
env:
- name: JAVA_OPTS
value: "-XX:MaxRAMPercentage=70.0"
- name: jvmOverride
value: "true"

2. Memory Limit'lerini Artırma​

Kubernetes deployment'ında memory limit'lerini artırın:

resources:
limits:
memory: "4Gi"
requests:
memory: "2Gi"
OpenTelemetry Java agent ve Metaspace

Log kayıtlarında java.lang.OutOfMemoryError: Metaspace görürseniz container bellek limitini ve Metaspace üst sınırını kontrol edin. Metaspace üst sınırı bellek limitine göre kademeli belirlenir (1 Gi → 128m, 2 Gi → 192m, 4 Gi → 256m) ve heap ayarları bu alanı büyütmez. OpenTelemetry Java agent kullanılan Worker'larda bellek limiti en az 2 Gi olmalıdır; yalnızca -XX:MaxMetaspaceSize değerini yükseltmek, pod limiti artırılmadığında OOMKilled riskini büyütür. Ayrıntı için OpenTelemetry entegrasyonu (Bölüm 1) sayfasına bakın.

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

İlgili Kaynaklar​