Zyph0rr

Yaratık Tuzağı: Çalışıyor
Seçkin Yazar
Katılım
3 Ocak 2025
Mesajlar
679
Elmaslar
357
Puan
2.355
Konum
Amasya
Minecraft
Zyph0rr

Discord:

bosstrap


Selam millet,


Bir süredir kafamı kurcalayan bir soru vardı. Discord'da, forumlarda, YouTube yorumlarında sürekli "Java'yı güncelle, FPS'in uçar" ya da "Java 8 en iyisi, gerisi boş" diye kavga eden insanlar görüyorum. Herkes kendi dediğinin doğru olduğundan emin ama kaynak gösteren pek yok. Ben de bir hafta sonumu buna gömdüm. Hem kendi bilgisayarımda denedim hem de bu işi ciddi ciddi test etmiş insanların yazdıklarını okudum. Aşağıda hepsini topladım.


Uzun bir konu oldu. Sadece özet isteyen en alttaki "Kısaca" kısmına geçebilir.


​


1) Önce şunu netleştirelim: Java'yı artık siz seçmiyorsunuz


Bunu bilmeyen çok kişi var. Eskiden bütün Minecraft Java 8'le açılıyordu, şimdi öyle değil. Mojang her büyük güncellemede minimum Java sürümünü yükseltti:


1.16.5 ve öncesi: Java 8
1.17: Java 16
1.18 – 1.20.4 arası: Java 17
1.20.5 – 1.21.x: Java 21
26.1 ve sonrası (yeni sürüm numaralandırması): Java 25

Yani 1.21 oynuyorsanız Java 8'le açamazsınız bile, oyun direkt hata verir. Resmi launcher doğru Java'yı kendisi indirip kullanıyor, çoğu kişinin bununla uğraşmasına gerek yok. Bu tablonun kaynağı
Değerli ziyaretçimiz, içeriği görebilmek için şimdi giriş yapın veya kayıt olun.
. 26.1'in Java 25 istediği de
Değerli ziyaretçimiz, içeriği görebilmek için şimdi giriş yapın veya kayıt olun.
yazıyor.


Peki bu konu kimi ilgilendiriyor?


Eski sürümlerde (1.12.2, 1.16.5 gibi) modpack oynayanları
Prism, MultiMC, ATLauncher gibi üçüncü parti launcher kullananları (bunlarda Java'yı elle seçebiliyorsunuz)
Sunucu açanları (en çok onları ilgilendiriyor)
Minimumun üstüne çıkmak isteyenleri. Mesela 1.21'i Java 21 yerine Java 25'le açmak mümkün, yeni Java genelde eski oyunu sorunsuz çalıştırıyor.

​


2) Bu işi en ciddi test eden kaynak


Araştırırken en çok işime yarayan şey
Değerli ziyaretçimiz, içeriği görebilmek için şimdi giriş yapın veya kayıt olun.
oldu. Adam kendine bir benchmark scripti yazmış. Sunucu tarafında chunk üretim süresini, client tarafında Intel PresentMon ile FPS'i ölçüyor, sonra bir sürü Java sürümünü, dağıtımını ve flag'i tek tek karşılaştırıyor. Vardığı sonuçlardan bence en önemlileri şunlar:


1.16.5 ve üstü için Java 17 öneriyor. Java 17'nin bazı modlarda sorun çıkardığı yerlerde Java 11'i yedek olarak gösteriyor. 1.12.2 ve altı genelde zaten Java 8 istiyor.
Adoptium, Azul, Microsoft gibi OpenJDK dağıtımları arasında fark yok. "Neredeyse birebir aynı" diyor. Yani "Zulu daha hızlı" gibi laflar boş.
GraalVM Enterprise'da sunucu tarafında chunk üretimi %20'nin üstünde hızlanabiliyor. Bu bayağı ciddi bir rakam.
IBM OpenJ9 daha az RAM yiyor ama sunucuda chunk üretiminde %30'dan fazla yavaş. "Az RAM kullanıyor" diye OpenJ9 önerenler var, bu yüzden dikkat.

Yani aynı sürümün farklı dağıtımları arasında pek fark yok ama farklı JVM türleri (GraalVM, OpenJ9) arasında ciddi fark çıkabiliyor.


​


3) "Java 8 daha hızlı" diyenler tamamen haksız mı?


İlginç olan şu: aynı repoda birisi
Değerli ziyaretçimiz, içeriği görebilmek için şimdi giriş yapın veya kayıt olun.
diye bir konu açmış. Kendi testlerinde varsayılan ayarlardaki Java 8'i bile hiçbir şeyin geçemediğini söylüyor.


Yani "yeni Java her zaman daha hızlıdır" diye bir kural yok. Sisteme, modpack'e ve kullanılan flag'lere göre sonuç değişebiliyor. Bu yüzden internette "şunu yap, FPS'in iki katına çıkar" diyen herkese şüpheyle yaklaşın, ben dahil. :)


​


4) Benim denemem: 1.16.5 Fabric + Sodium


Orta seviye bir sistemim var. Oyuna 6 GB RAM ayırdım, render mesafesi 16 chunk. Aynı seed'le yeni dünya açıp spawn'dan düz bir hat boyunca elytra ile uçtum, sonra köyde biraz durdum. Bunu hem Java 8'le hem Java 17'yle birkaç kere yaptım. Forge 1.16.5'te bazı modlar yeni Java'da patlayabildiği için Fabric'le denedim.


Laboratuvar testi değil, düzgün bir benchmark aracım da yoktu, o yüzden rakam vermeyeceğim. Hissettiğim şey şu: ortalama FPS'te gözle görülür bir fark yoktu. F3'teki sayılar ikisinde de benzer aralıkta dolanıyordu. Ama Java 8'de yeni chunk'lara girerken olan "tık tık" mikro donmalar Java 17'de biraz daha az geldi. Bunun da muhtemel sebebi garbage collector. Minecraft sürekli nesne oluşturup atıyor, Java da arada bunları temizliyor. Yeni Java sürümlerinde bu temizlik daha kısa ve daha akıllıca yapılıyor. Oracle'da GC üzerinde çalışan bir geliştiricinin
Değerli ziyaretçimiz, içeriği görebilmek için şimdi giriş yapın veya kayıt olun.
var, merak eden okuyabilir.


Ama bir üstte dediğim gibi, bu herkeste böyle olacak demek değil.


​


5) Java 25 ve "Compact Object Headers"


Yeni sürümleri oynayanları ilgilendiren kısım bu. Java 25'te "Compact Object Headers" diye bir özellik resmi hale geldi (JEP 519). Kabaca her Java nesnesinin başındaki bilgi alanını 12 byte'tan 8 byte'a indiriyor.
Değerli ziyaretçimiz, içeriği görebilmek için şimdi giriş yapın veya kayıt olun.
göre:


SPECjbb2015 testinde %22 daha az heap kullanımı ve %8 daha hızlı çalışma görülmüş
G1 ve Parallel GC'de çöp toplama sıklığı %15 azalmış
Amazon kendi servislerinde bundan ciddi CPU tasarrufu elde ettiğini söylemiş
En kötü durumda performans kaybının %5'i geçmediği belirtiliyor

Minecraft milyonlarca küçük nesneyle çalışan bir oyun. Yani tam bu özelliğin fayda sağladığı türden bir program. Ama şunu açıkça söyleyeyim: bunu Minecraft'ta ölçen düzgün bir test bulamadım. Rakamlar genel Java testlerinden. Denemek isteyen JVM argümanlarına şunu eklesin:


-XX:+UseCompactObjectHeaders


Sadece Java 25 ve üstünde çalışıyor. Eski Java'da eklerseniz oyun açılmaz. Özellikle RAM'i kısıtlı olup büyük modpack oynayanlar denemeli.


​


6) GC meselesi: ZGC, Shenandoah, G1


Burada çok yanlış bilgi dolaşıyor. İnternette "ZGC kullan, takılmalar biter" diyen çok kişi var. brucethemoose'un testlerine göre durum biraz farklı:


G1GC: Varsayılan olan. Client için önerdiği GC bu. Meşhur Aikar's flags da bunun üzerine kurulu.
ZGC: Sunucuda ölçülebilir bir hız kaybı yaratmıyor. Ama client tarafında ciddi FPS düşüşüne sebep oluyor. Yani oyuncu olarak ZGC açmak çoğu zaman kötü fikir.
Shenandoah: Tam tersi. Client'ta iyi çalışıyor ama sunucu performansını öldürüyor.

Bir de GraalVM Enterprise sadece G1GC ile çalışıyor. ZGC ve Shenandoah onda yok.


Değerli ziyaretçimiz, içeriği görebilmek için şimdi giriş yapın veya kayıt olun.
da aynı sonucu aktarıyor ve güzel bir öneri yapıyor: başkasının flag listesini kopyalamak yerine GC log'unu açıp kendi sunucunuzun gerçekte ne kadar duraksadığına bakın. Java 11 ve üstünde şu argümanla oluyor:


-Xlog:gc*:logs/gc.log:time,uptime:filecount=5,filesize=1M


​


7) Sunucu tarafı


Sunucu açanlar için Java sürümü ve GC seçimi client'tan bile önemli. Sunucuda GC duraklaması olunca herkes aynı anda lag yiyor, TPS düşüyor, "sunucu kasıyor" şikayetleri başlıyor.


Benim küçük arkadaş sunucumda (5-6 kişi, Paper) Aikar's flags gayet yeterliydi, ekstra bir şeye gerek duymadım. Daha büyük sunucularda ZGC denenebilir, çünkü sunucu tarafında hız kaybı yaratmadığı ölçülmüş. Chunk üretimi çok olan sunucularda (yeni harita, pre-gen vs.) GraalVM de bakmaya değer. Zerve'nin yazısında G1GC, ZGC ve Shenandoah sunucu açısından karşılaştırılmış. Hangi sürümün hangi Java'yı istediği de
Değerli ziyaretçimiz, içeriği görebilmek için şimdi giriş yapın veya kayıt olun.
güzel özetlenmiş.


​


8) Sık yapılan hatalar


Aşırı RAM ayırmak: brucethemoose da açıkça yazıyor: fazla RAM ayırmak GC'yi bozabiliyor ya da Minecraft'ı yavaşlatabiliyor. Genelde 8 GB'ın altı yetiyor. Minimum ve maksimum RAM'i (-Xms ve -Xmx) aynı değere ayarlamanızı da öneriyor.
İnternetten bulunan flag listesini körü körüne yapıştırmak: 2015'ten kalma, Java 8'e özel flag'ler yeni Java'da ya hiçbir işe yaramıyor ya da oyunun açılmamasına sebep oluyor.
"Şu dağıtım daha hızlı" efsanesi: Temurin, Zulu, Microsoft OpenJDK hepsi aynı kapıya çıkıyor. OpenJ9 ise sunucuda ciddi yavaş.
Client'ta ZGC açmak: Yukarıda anlattım, FPS düşürüyor.
Java'yı değiştirip modlara dokunmamak: Sodium, Lithium, FerriteCore gibi optimizasyon modları Java sürümünden çok daha büyük fark yaratıyor. Önce bunları kurun, sonra Java'yla oynayın.

​


Kısaca


Oyunun istediği minimum Java'yı zaten kullanmak zorundasınız, launcher bunu kendisi hallediyor.
Aynı Java sürümünün farklı dağıtımları arasında fark yok. GraalVM (sunucuda +%20 chunk üretimi) ve OpenJ9 (sunucuda -%30) ise fark yaratıyor.
"Yeni Java her zaman daha hızlı" diye bir kural yok. Java 8'in daha iyi çalıştığını söyleyen testler de var. Kendi sisteminizde deneyin.
Client'ta G1GC kalın, ZGC FPS düşürüyor. Sunucuda ZGC denenebilir.
Java 25 kullananlar Compact Object Headers'ı denesin, genel testlerde %20 civarı bellek tasarrufu sağlıyor.
Performans modları hâlâ en büyük kazancı sağlıyor.
RAM'i abartmayın.

Uzun oldu ama umarım işinize yarar. Elinde düzgün bir benchmark aracı olan, özellikle PresentMon ya da CapFrameX ile ölçüm yapabilen varsa sonuçlarını paylaşsın. Konuya eklerim, Türkçe kaynakta böyle rakamlar gerçekten eksik.
​
 
Eline Sağlık derinlemesine bir inceleme olmuş şahsen o kadarına da kimse takılıyorumdur bilmiyorum ama yıllardır en son java güncelleme geldikçe güncelliyorum performans modlarına tabi elim hiç gitmiyor ama cidden işe yarıyorlar
 
Şu anda bu konuyu görüntüleyenler 1

Hala Discord sunucumuza katılmadın mı?

Büyük bir topluluğun parçası ol, etkinliklere katıl ve özel hediyeler kazanma şansı yakala!

Şimdi Katıl