Aikar’s Flags, Minecraft sunucusu çalıştıran herkesin bir yerlerde kopyalayıp yapıştırdığı o uzun JVM bayrak dizisidir. Adını, Paper projesinin kurucu geliştiricisi Aikar’dan alır ve tek bir işi yapar: Java’nın G1 çöp toplayıcısını Minecraft’ın kendine özgü bellek ayırma davranışına göre yeniden ayarlar. Amacı sunucuyu “hızlandırmak” değildir — amacı, saniyede yüz binlerce kısa ömürlü nesne üreten bir uygulamada çöp toplama duraklamalarını kısaltıp tick süresini düzleştirmektir.
Bu sayfada setteki her bayrağın ne yaptığını tek tek, 26.x sunucularında hâlâ geçerli olup olmadığını, heap büyüklüğüne göre neyin değiştiğini ve ne zaman ZGC’ye geçmenin mantıklı olduğunu bulacaksınız. Sonunda 8, 12, 16 ve 32 GB’lık paketler için doğrudan kopyalanabilir tam başlatma satırları var.
Aikar’s Flags tam olarak neyi çözüyor?#
Minecraft sunucusu bellek açısından tuhaf bir yazılımdır. Her tick’te muazzam sayıda kısa ömürlü nesne üretir: konum vektörleri, paket nesneleri, entity durum kopyaları, chunk erişim anahtarları. Bunların neredeyse tamamı milisaniyeler içinde çöpe döner. Java’nın G1 çöp toplayıcısı varsayılan ayarlarıyla genç kuşağı görece küçük tutar; bu da çok sık ama kısa toplama turları, arada bir de uzun ve sinir bozucu bir “karışık” tur anlamına gelir.
Aikar’s Flags dengeyi tersine çevirir. Genç kuşağı bilinçli olarak büyütür, karışık toplamayı heap dolmadan çok önce ve küçük parçalar hâlinde tetikler, uygulamanın kendi kendine çöp toplama çağırmasını engeller. Kazanç ortalama hızda değil, dağılımın kuyruğundadır: 400 milisaniyelik tek bir duraklama yerine, kimsenin fark etmediği yirmi tane 20 ms’lik duraklama görürsünüz. Oyuncu tarafında bu fark, “ara sıra donuyor” ile “akıcı” arasındaki farktır.
Setin tamamı: 10 GB heap için tam komut#
Aşağıdaki dizi PaperMC dokümanındaki resmî settir; 12 GB’lık bir pakette (10 GB heap) doğrudan kullanılabilir. Tek satırdır, kopyalarken bölmeyin:
java -Xms10G -Xmx10G --add-modules=jdk.incubator.vector -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -jar paper.jar --nogui
Uzun görünüyor ama içinde gereksiz tek bir bayrak yok. Şimdi hepsini tek tek açalım.
Bayrak bayrak ne yapıyor?#
| Bayrak | Ne yapar | Neden Minecraft’ta önemli |
|---|---|---|
-XX:+UseG1GC | G1 çöp toplayıcısını seçer | Setin temeli. Java 25’te zaten varsayılan, ama açıkça yazmak niyeti belgeler ve yanlış bir bayrağın devreye girmesini önler |
-XX:G1NewSizePercent=30 | Genç kuşağın heap içindeki alt sınırını %30’a çeker | Varsayılan %5’tir. Minecraft’ın kısa ömürlü nesne seli için fazla küçüktür; genç kuşak büyüdükçe nesneler eski kuşağa terfi etmeden ölür |
-XX:G1MaxNewSizePercent=40 | Genç kuşağın üst sınırını %40 yapar | G1’in genç kuşağı duraklama hedefini tutturmak için aşırı küçültmesini engeller |
-XX:G1HeapRegionSize=8M | Heap’i 8 MB’lık bölgelere böler | Chunk ve entity verisi gibi büyük nesnelerin “humongous” sayılıp özel yola sokulmasını azaltır |
-XX:MaxGCPauseMillis=200 | Hedef duraklama süresini 200 ms olarak bildirir | Bir garanti değil, bir hedeftir. Daha düşük vermek G1’i genç kuşağı küçültmeye iter ve genelde işleri kötüleştirir |
-XX:G1MixedGCLiveThresholdPercent=90 | %90’a kadar dolu bölgeleri de karışık toplamaya dâhil eder | Varsayılan %85’tir. Yükseltmek, eski kuşakta çöp birikmesini engelleyip tam toplama riskini düşürür |
-XX:G1MixedGCCountTarget=4 | Karışık toplamayı dört tura yayar | Tek bir uzun tur yerine dört kısa tur: kuyruktaki duraklamalar kısalır |
-XX:InitiatingHeapOccupancyPercent=15 | Eşzamanlı işaretleme turunu heap %15 doluyken başlatır | Varsayılan %45’tir. Erken başlatmak, temizliğin oyuncu yoğunluğu artmadan bitmesini sağlar |
-XX:G1ReservePercent=20 | %20’lik bir yedek alan ayırır | Ani ayırma patlamalarında “promotion failure” ve onu izleyen tam toplamayı önler |
-XX:G1HeapWastePercent=5 | Tolere edilen çöp oranını %5’e indirir | Varsayılan %10’dur. Düşürmek, G1’in temizliği ertelemesini engeller |
-XX:G1RSetUpdatingPauseTimePercent=5 | Hatırlama kümesi güncellemesinin duraklama payını %5’e çeker | Bu işin çoğunu eşzamanlı iş parçacıklarına devreder; duraklama süresi kısalır |
-XX:SurvivorRatio=32 | Eden ile survivor alanları arasındaki oranı belirler | MaxTenuringThreshold=1 ile birlikte çalışır: nesneler survivor’da oyalanmadan ya ölür ya terfi eder |
-XX:MaxTenuringThreshold=1 | Bir turda hayatta kalan nesneyi doğrudan eski kuşağa terfi ettirir | Minecraft’ta bir tur yaşayan nesne genelde uzun yaşar; kopyalama maliyeti boşuna ödenmez |
-XX:+ParallelRefProcEnabled | Referans işlemeyi paralel iş parçacıklarına dağıtır | Eklenti yoğun sunucularda çok sayıda zayıf/yumuşak referans olur; tek iş parçacığıyla işlenmesi duraklamayı uzatır |
-XX:+DisableExplicitGC | Koddaki System.gc() çağrılarını yok sayar | Bazı eklentiler “belleği temizliyoruz” diye tam toplama tetikler; bu bayrak o saniyelik donmaları keser |
-XX:+AlwaysPreTouch | Heap sayfalarına açılışta dokunur | Bellek gerçekten baştan ayrılır; ilk yarım saatteki sayfa hatası kaynaklı tick sıçramaları kaybolur |
-XX:+PerfDisableSharedMem | JVM’in performans sayaçlarını disk yerine bellekte tutar | Disk yoğun anlarda sayaç yazımının tick’i kilitlemesini engeller |
-XX:+UnlockExperimentalVMOptions | Deneysel bayrakların kabul edilmesini sağlar | Setteki bazı G1 ayarları bu kilidi ister; tek başına hiçbir davranış değiştirmez |
--add-modules=jdk.incubator.vector | Vektör API modülünü açar | Paper ve Purpur’un SIMD hızlandırmalı kod yollarını kullanabilmesi için gerekir |
-XX:+AlwaysPreTouch bayrağını Pterodactyl gibi konteyner tabanlı panellerde kullanmayın. Konteyner bellek limiti heap dışı kullanımı da saydığı için açılışta tüm sayfalara dokunmak sunucunun OOM ile öldürülmesine yol açabilir. Panel tarafındaki limit, heap’ten en az 2 GB büyük olmalıdır.Xms = Xmx neden pazarlık konusu değil?#
-Xms JVM’in açılışta ayırdığı heap, -Xmx ise büyüyebileceği tavandır. Masaüstü uygulamalarında bu ikisini farklı vermek mantıklıdır. Minecraft sunucusunda değildir: dünya yüklenir, eklentiler önbelleklerini kurar, oyuncular girer ve heap zaten ilk saatte tavana yaklaşır. Aradaki her genişleme adımı ek bir toplama turu ve bellek haritalama maliyeti üretir.
Ayrıca G1, boş heap alanını “ziyan” olarak görmez; elindeki alanı toplama stratejisini planlarken kullanır. Ona baştan ne kadar alanı olduğunu söylemek, doğru karar vermesini sağlar. Bu yüzden aşağıdaki tüm örneklerde iki değer birbirine eşittir ve toplam sistem belleğinden işletim sistemi ile JVM’in heap dışı kullanımı için 2 GB pay bırakılmıştır. Heap boyutlandırmasının tamamı RAM ayarları sayfasında.
Heap 12 GB’ı aşarsa değişen beş bayrak#
Aikar’ın kendi notlarında açıkça belirtilen bir eşik var: heap 12 GB’ın üzerine çıktığında genç kuşak büyütülür, bölge boyutu iki katına çıkar ve toplama biraz daha geç tetiklenir. Değiştirilecek satırlar şunlar:
-XX:G1NewSizePercent=40
-XX:G1MaxNewSizePercent=50
-XX:G1HeapRegionSize=16M
-XX:G1ReservePercent=15
-XX:InitiatingHeapOccupancyPercent=20
Geri kalan bayraklar aynen kalır. Yani 16 GB’lık bir pakette (14 GB heap) ve 32 GB’lık bir pakette (28 GB heap) bu beş değeri güncellenmiş hâliyle kullanırsınız; 8 ve 12 GB’lık paketlerde standart set geçerlidir.
Pakete göre tam başlatma satırları#
Aşağıdaki dört satır doğrudan kullanılabilir. Jar adını kendi dosyanızla değiştirin — Purpur için purpur.jar, Fabric için fabric-server-launch.jar, Forge’da ise installer’ın ürettiği başlatma betiği kullanılır.
8 GB paket (6 GB heap)#
java -Xms6G -Xmx6G --add-modules=jdk.incubator.vector -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -jar paper.jar --nogui
12 GB paket (10 GB heap)#
Yukarıda verdiğimiz resmî setin aynısıdır; tek fark -Xms10G -Xmx10G değerleridir. Bu, 10-30 oyunculu eklentili bir Paper sunucusunun tipik yapılandırmasıdır.
16 GB paket (14 GB heap)#
java -Xms14G -Xmx14G --add-modules=jdk.incubator.vector -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=40 -XX:G1MaxNewSizePercent=50 -XX:G1HeapRegionSize=16M -XX:G1ReservePercent=15 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=20 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -jar paper.jar --nogui
32 GB paket (28 GB heap)#
java -Xms28G -Xmx28G --add-modules=jdk.incubator.vector -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=40 -XX:G1MaxNewSizePercent=50 -XX:G1HeapRegionSize=16M -XX:G1ReservePercent=15 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=20 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -jar paper.jar --nogui
Bu satırları her seferinde konsola yazmazsınız; bir başlatma dosyasına koyarsınız. Windows tarafında start.bat oluşturma sayfası, Linux tarafında ise systemd servisi kurulumu doğru yapıyı adım adım anlatıyor.
26.x sunucularında geçerli mi? İstemci–sunucu ayrımı#
2026’da en çok yanlış aktarılan konu bu. 26.1 sürüm notlarında geçen “garbage collection has been changed from G1GC to ZGC for compatible computers” satırı, Minecraft Launcher’ın oyun istemcisine verdiği JVM varsayılanını anlatır. Aynı sürüm notundaki “oyun artık varsayılan 4 GB RAM ayırıyor” maddesi de istemci tahsisidir.
Sunucu jar’ının bir launcher’ı yoktur. java -jar paper.jar yazdığınızda hangi çöp toplayıcının çalışacağını yalnızca sizin verdiğiniz bayraklar ve JVM’in kendi varsayılanı belirler. Java 25’te JEP 523 ile G1, tüm ortamlarda genel varsayılan çöp toplayıcıdır. Yani bayraksız açtığınız bir 26.2 sunucusu ZGC değil G1GC kullanır — ve Aikar’s Flags tam olarak bu G1’i ayarladığı için hala işini yapmaya devam eder.
-XX:+UseZGC -XX:+ZGenerational kombinasyonunu da kopyalamayın: JEP 490 ile ZGC’nin non-generational modu kaldırıldı, -XX:+ZGenerational Java 25’te obsolete durumdadır ve yalnızca uyarı basar. Doğru kullanım tek başına -XX:+UseZGC.Ne zaman ZGC’ye geçilir?#
Pratik ayrım basit: 8-12 GB heap → G1GC + Aikar’s Flags. Bu aralıkta setin verdiği sonuç öngörülebilir ve topluluk tarafından fazlasıyla test edilmiştir. 16 GB ve üzeri heap, ya da yüzlerce mod barındıran ağır bir modpack → ZGC değerlendirilebilir. ZGC duraklama süresini heap büyüklüğünden bağımsız olarak milisaniyenin altında tutmayı hedefler; karşılığında daha fazla CPU zamanı ve heap dışı bellek harcar.
ZGC’ye geçerken setteki tüm G1* bayraklarını, MaxGCPauseMillis ve SurvivorRatio gibi G1’e özgü ayarları silin. Kalması gereken çekirdek şudur:
java -Xms28G -Xmx28G -XX:+UseZGC -XX:+UseCompactObjectHeaders -XX:+UseStringDeduplication -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+PerfDisableSharedMem -jar paper.jar --nogui
Karar vermeden önce ölçün. Sunucuyu bir hafta G1GC + Aikar’s Flags, sonraki hafta ZGC ile aynı oyuncu yoğunluğunda çalıştırın ve tick süresi dağılımını karşılaştırın. İki toplayıcının teknik farkları ve ölçüm yöntemi GC seçimi ve ayarları sayfasında ayrıntılı.
Gerekli indirmeler#
26.1 ve sonrası Java 25 ister. Daha eski bir JDK ile açmaya çalışırsanız sunucu UnsupportedClassVersionError ile durur; sürüm eşleşmesinin tamamı hangi Java sürümü gerekir sayfasında. Java 26 çıktı ama LTS değil; sunucu tarafında Java 25 LTS’te kalın.
Bağlantılar resmî kaynaklara gider. Üçüncü taraf sitelerden jar veya JDK indirmeyin.
Sık yapılan hatalar#
Bayrakları jar’dan sonra yazmak#
JVM argümanları -jar ifadesinden önce gelmelidir. Sonrasına yazılan her şey sunucu uygulamasına parametre olarak geçer ve JVM tarafından tamamen yok sayılır. Sunucu açılır, hiçbir bayrak uygulanmaz, siz de neden değişmediğini anlamazsınız.
Setin yarısını kopyalamak#
Bayraklar birlikte tasarlandı. MaxTenuringThreshold=1 ile SurvivorRatio=32 birbirini tamamlar; InitiatingHeapOccupancyPercent=15 düşük tutulmuşken G1ReservePercent atlanırsa yedek alan yetmez. Yarım set, hiç bayrak vermemekten daha kötü sonuç üretebilir.
MaxGCPauseMillis değerini düşürmek#
“50 ms yazayım da duraklamalar kısalsın” mantığı ters teper. G1 hedefi tutturmak için genç kuşağı küçültür, bu da daha sık toplama ve daha çok terfi demektir. 200 ms bilinçli seçilmiş bir değerdir, dokunmayın.
Eski sürümlerin bayraklarını taşımak#
1.12.2 döneminden kalma -XX:+UseConcMarkSweepGC gibi bayraklar modern JVM’de tamamen kaldırıldı; sunucu hiç açılmaz. Eski bir sunucuyu 26.2’ye taşırken başlatma satırını sıfırdan yazın. Sürüm geçişinin tamamı sürüm yükseltme rehberinde.
Bayrakları donanım eksikliğinin üstünü örtmek için kullanmak#
Aikar’s Flags, paylaşımlı vCPU’lu düşük frekanslı bir makineyi kurtarmaz; orada bayrak eklemek pratikte birşey değiştirmez. Ana tick döngüsü tek çekirdekte çalıştığı için belirleyici olan çekirdek sayısı değil saat hızıdır. Yüksek frekanslı AMD Ryzen 9 ve NVMe SSD üzerine kurulu Minecraft sunucu paketleri ile bayrakların katkısı gerçekten görünür hâle gelir.
Özetle#
Aikar’s Flags, G1GC’yi Minecraft’ın nesne üretim ritmine göre ayarlayan ve 26.x sunucularında hâlâ geçerli olan bir settir. Genç kuşağı büyütür, karışık toplamayı erken ve parçalı tetikler, açık GC çağrılarını keser; kazanç ortalama TPS’te değil, uzun duraklamaların kaybolmasındadır. -Xms ve -Xmx daima eşit verilir: 8 GB paket için 6 GB, 12 GB için 10 GB, 16 GB için 14 GB, 32 GB için 28 GB heap. Heap 12 GB’ı aşarsa beş bayrağın değeri güncellenir.
26.1 ile duyurulan ZGC geçişinin istemciye ait olduğunu, sunucunuzun bayraksız çalıştığında G1GC kullandığını ve -XX:+ZGenerational bayrağının Java 25’te obsolete olduğunu unutmayın. 16 GB üzeri heap veya ağır modpack çalıştırıyorsanız ZGC’yi deneyin, ama iki seti asla karıştırmayın. Ve her değişiklikten sonra ölçün — bayraklarla değil, optimizasyon rehberindeki adımlarla birleştiğinde gerçek fark ortaya çıkar.