Otomatik Bellek Profili Sistemi
Apinizer, tüm modüllerinde (Worker, Cache, Manager, Integration) container başlangıcında otomatik bellek profili sistemi kullanır. Bu sistem:- Container’a ayrılan bellek miktarını cgroup üzerinden tespit eder
- Bellek miktarına göre uygun bir profil seçer
- Profil kapsamında GC algoritmasını ve heap yüzdesini otomatik belirler
Profil Seçim Tablosu
Profil seçimi container başlangıcında pod log’larına yazdırılır. Örnek:
Profil Seçim Öncelik Sırası
Sistem, aşağıdaki sırayla karar verir:JVM_MEMORY_PROFILEortam değişkeni — Ayarlanmışsa (low,mediumveyahigh), doğrudan bu profil kullanılırJAVA_OPTSiçindeki GC/heap ayarları — KullanıcıJAVA_OPTS’da GC (-XX:+UseG1GCvb.) veya heap (-XX:MaxRAMPercentage,-Xmxvb.) belirtmişse, otomatik değerler geçersiz kılınır- Otomatik algılama — Yukarıdakiler yoksa, container belleği cgroup’tan okunur ve profil tablosuna göre seçim yapılır
Garbage Collector Türleri
Apinizer’ın kullandığı base image Eclipse Temurin 25 olduğundan, aşağıdaki GC algoritmaları desteklenir:Serial GC
Tek thread’li, en basit GC algoritmasıdır. Küçük heap boyutlarında ek thread ve bellek yükü oluşturmaz.- Ne zaman kullanılır: ≤ 768 MB bellek, düşük trafikli ortamlar, test/geliştirme
- Avantaj: Minimum CPU ve bellek overhead’i
- Dezavantaj: GC sırasında uygulama tamamen durur (Stop-the-World)
- JVM parametresi:
-XX:+UseSerialGC
G1GC (Garbage-First)
Region tabanlı, paralel ve eş zamanlı çalışabilen GC’dir. Heap’i eşit bölgelere ayırarak çöp toplama süresini tahmin edilebilir kılar.- Ne zaman kullanılır: 769 MB – 1536 MB bellek, orta trafikli ortamlar
- Avantaj: Dengeli throughput ve düşük GC duraklaması
- Dezavantaj: Serial GC’ye göre daha fazla CPU kullanır
- JVM parametreleri:
-XX:+UseG1GC -XX:G1HeapRegionSize=1m
ZGC (Z Garbage Collector)
Düşük gecikmeli, ölçeklenebilir GC’dir. GC duraklamaları heap boyutundan bağımsız olarak genellikle 1 ms altındadır.- Ne zaman kullanılır: > 1536 MB bellek, yüksek trafikli production ortamları
- Avantaj: Sabit ve çok düşük GC duraklaması (sub-millisecond), büyük heap’lerde mükemmel performans
- Dezavantaj: Colored pointer ve multi-mapping nedeniyle daha fazla native bellek tüketir (~%15-20 ek yük)
- JVM parametreleri:
-XX:+UseZGC -XX:+AlwaysPreTouch
Karşılaştırma Tablosu
ZGC Güvenlik Sınırı
Sorun
ZGC, colored pointer ve multi-mapping mekanizmaları nedeniyle diğer GC’lere kıyasla önemli ölçüde daha fazla native bellek (heap dışı bellek) kullanır. Mevcut kurulumlardan upgrade yapıldığında, eskiMaxRAMPercentage=80.0 ayarı G1GC için güvenli olsa da ZGC için container OOM Kill’e neden olabilir.
Otomatik Cap Mekanizması
Apinizer, bu durumu önlemek için bir güvenlik mekanizması uygular:- ZGC otomatik seçildiğinde ve kullanıcı
JAVA_OPTS’daMaxRAMPercentagedeğerini %70’in üzerinde ayarlamışsa:- Heap yüzdesi otomatik olarak %70’e düşürülür
- Pod log’larında aşağıdaki uyarı mesajı görünür:
Devre Dışı Bırakma
Cap mekanizmasını devre dışı bırakmak içinJAVA_OPTS’da GC’yi açıkça belirtin. Bu durumda otomatik GC seçimi ve güvenlik cap’i devreden çıkar:
Modül Bazlı Öneriler
Worker (Gateway)
Gateway pod’ları yüksek eşzamanlı HTTP trafiği işler. Bellek yapılandırması trafik yoğunluğuna göre belirlenir. Düşük trafik (≤ 500 TPS):Cache (Hazelcast)
Cache Server pod’ları büyük veri yapıları tutar ve uzun ömürlü nesnelere sahiptir. Büyük heap boyutlarında ZGC’nin düşük GC duraklaması, Hazelcast cluster iletişiminde timeout riskini azaltır. Standart cache kullanımı:Manager
Manager pod’ları web arayüzü ve konfigürasyon yönetimi sağlar. Yoğun trafik işlemez, standart otomatik profil yeterlidir.Integration
Integration pod’ları zamanlanmış görevleri çalıştırır. Standart otomatik profil yeterlidir.Portal
Portal modülü sabit olarak ZGC kullanır (otomatik profil sistemi yoktur). ZGC güvenlik cap’i uygulanır —MaxRAMPercentage %70’in üzerinde ayarlanırsa otomatik olarak %70’e düşürülür.
Yapılandırma Örnekleri
Otomatik Profil (Önerilen)
En basit kullanım —JAVA_OPTS boş bırakılır veya GC/heap dışı parametreler eklenir:
Manuel GC Seçimi
Belirli bir GC kullanmak istiyorsanızJAVA_OPTS’da belirtin. Otomatik GC seçimi devreden çıkar, ancak heap yüzdesi hala otomatik ayarlanır:
Manuel Heap Ayarı
Heap yüzdesini kendiniz belirlemek istiyorsanız:Manuel Profil Seçimi (JVM_MEMORY_PROFILE)
Otomatik algılamayı atlamak ve belirli bir profili zorlamak için:Tier Bazlı Hazır Şablonlar
Tier 1 — Geliştirme/Test (1 Core / 512 MB):MaxRAMPercentage Güvenli Sınırlar Tablosu
Sorun Giderme
OOM Kill
Belirti: Pod sürekli restart oluyor,kubectl describe pod çıktısında OOMKilled görünüyor.
Olası Nedenler ve Çözümler:
Yüksek GC Duraklaması
Belirti: Yanıt süreleri periyodik olarak artıyor, P99 latency yüksek. Çözümler:- G1GC kullanıyorsanız: Container belleğini > 1536 MB’a çıkarın (otomatik olarak ZGC seçilir) veya
JVM_MEMORY_PROFILE=highayarlayın - Serial GC kullanıyorsanız: Container belleğini artırın veya en az
mediumprofile geçin - G1GC’de
-XX:MaxGCPauseMillis=200parametresi eklenebilir
Log’da WARNING Mesajı
Pod log’larında aşağıdaki mesajı görüyorsanız:MaxRAMPercentage=80 (veya %70’in üzerinde bir değer) ayarlanmış, ancak otomatik profil ZGC seçmiş. Güvenlik cap’i devreye girerek heap yüzdesini %70’e düşürmüştür.
Çözüm seçenekleri:
JAVA_OPTS’danMaxRAMPercentageayarını tamamen kaldırın — otomatik profil en uygun değeri seçer- GC’yi açıkça belirtin:
-XX:+UseG1GC -XX:MaxRAMPercentage=80.0(cap devreden çıkar) MaxRAMPercentagedeğerini %70 veya altına düşürün

