Menü
💬 Forum 🛒 Mağaza ⛏️ Sunucular ⚔️ Klanlar 📰 Blog 🏆 Liderlik 👥 Üyeler 🎖️ Rütbeler
0 üye online 👥 5 toplam üye 📝 Bugün 73 konu 💬 Bugün 73 mesaj

📖 Rehber JVM Garbage Collection ve Minecraft Bellek Yönetimi Rehberi

orginscorel · 3 saat önce · 1 gönderi · 1 görüntülenme
#1

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.

Cevap yazabilmek için giriş yap.