JVM Garbage Collection ve Minecraft Bellek Yönetimi
Minecraft sunucusu çalışırken zaman zaman "GC pause" (çöp toplama duraksatması) kaynaklı ani TPS düşüşleri yaşanır. Oyun normal akışında birden donup 1-2 saniye sonra devam eder; TPS grafiğinde keskin bir dip görünür. Bu "GC spike" olarak bilinen sorundur. Bu rehberde JVM bellek yönetimini, GC seçimini ve doğru başlatma parametrelerini anlatıyorum.
Garbage Collection Nedir?
Java, kullanılmayan nesneleri otomatik olarak bellekten temizler. Bu işleme Garbage Collection (GC) denir. GC çalışırken bazı durumlarda JVM tüm thread'leri durdurur ("stop-the-world"); bu, sunucunun kısa süre donmasına neden olur.
Minecraft bu açıdan zorlu bir Java uygulamasıdır: her tick binlerce nesne oluşturulur ve atılır (paket nesneleri, chunk verileri, entity güncellemeleri). Bu hız, GC'yi sık tetikler.
G1GC: Minecraft için Önerilen Temel Seçenek
G1GC (Garbage First), Java 9'dan itibaren varsayılan GC'dir ve büyük heap boyutlarında uzun duraksatmaları azaltmak için tasarlanmıştır. Aikar'ın (PaperMC kurucusu) yayımladığı flag seti bu probleme özel optimize edilmiştir:
java -Xms4G -Xmx4G \
-XX:+UseG1GC \
-XX:+ParallelRefProcEnabled \
-XX:MaxGCPauseMillis=200 \
-XX:+UnlockExperimentalVMOptions \
-XX:+DisableExplicitGC \
-XX:G1NewSizePercent=30 \
-XX:G1MaxNewSizePercent=40 \
-XX:G1HeapRegionSize=8M \
-XX:G1ReservePercent=20 \
-XX:InitiatingHeapOccupancyPercent=15 \
-XX:G1MixedGCCountTarget=4 \
-XX:MaxTenuringThreshold=1 \
-jar paper.jar nogui
Önemli Parametreler
- -Xms ve -Xmx eşit: JVM başlangıçta tüm belleği ayırır; büyütme/küçültme overhead'i olmaz.
- MaxGCPauseMillis=200: GC, mümkünse 200ms'den kısa duraksatmalar hedefler.
- G1HeapRegionSize=8M: Büyük nesnelerin (chunk verileri gibi) normal bölgelere sığmasını sağlar.
- InitiatingHeapOccupancyPercent=15: Heap %15 dolduğunda GC başlar; gecikmiş büyük GC'yi önler.
- DisableExplicitGC: Pluginlerin System.gc() çağırmasını engeller.
ZGC: Java 21 ile Daha İyi Alternatif
Java 21 ile ZGC kararlı üretime hazır hale geldi. GC duraksatmalarını neredeyse sıfıra indirir:
java -Xms4G -Xmx4G \
-XX:+UseZGC \
-XX:+ZGenerational \
-jar paper.jar nogui
ZGC daha fazla CPU kullanır ama "stop-the-world" duraksatmaları milisaniyeler mertebesine iner. 8GB+ RAM ve çok oyunculu sunucularda G1GC'den belirgin şekilde daha az GC spike üretir.
GC Spike'larını Tespit Etme
Spark'ın GC izleme özelliği:
/spark gc
Son GC olaylarını, sürelerini ve heap durumunu listeler. Sık sık uzun GC duraksatmaları görüyorsanız:
- Heap boyutunuzu artırın (-Xmx değerini yükseltin)
- ZGC'ye geçiş yapın
- Bellek sızıntısı için heap analizi yapın (/spark heap)
Bellek Sızıntısı Tespiti
Sunucu çalışmaya devam ettikçe bellek tüketimi artıyorsa bellek sızıntısı (memory leak) olabilir. İki farklı zamanda heap snapshot alın:
/spark heap
İki snapshot'ı karşılaştırın; sürekli büyüyen nesne sınıfı muhtemelen sızıntı kaynağıdır. Bu genellikle kötü yazılmış bir plugin'den kaynaklanır.
Sonuç
GC optimizasyonu, Minecraft sunucu performansının görünmez ama kritik bir boyutudur. Aikar Flags seti G1GC için standart başlangıç noktasıdır; Java 21 kullanıyorsanız ZGC'yi denemeye değer. Düzenli Spark ile izleme, GC kaynaklı TPS spike'larını erken tespit etmenizi sağlar.
💡 Etkileşim için giriş yap.