Ini adalah panduan untuk menyetel Java untuk Minecraft. Setiap flag dan tweak diukur secara individual untuk menguji regresi, dan diperiksa berdasarkan default Java untuk menghindari redundansi.
Meskipun penyesuaian ini secara signifikan mengurangi beberapa gangguan server dan klien, hanya mengharapkan sedikit peningkatan TPS + peningkatan FPS minimal, dan sedikit peningkatan penggunaan RAM + CPU. Dan mereka bukanlah pengganti untuk menyelesaikan masalah yang lamban dengan mod seperti Spark atau Observable.
Perselisihan untuk pertanyaan dan semacamnya: https://discord.gg/zeFSR9PnUw
Semua tanda diuji dengan skrip Benchmark.py. Lihat Benchmarks.md yang sedang dalam proses.
Untuk Minecraft 1.16.5 dan yang lebih baru, gunakan Java 17. Beberapa peluncur seperti Curseforge dan Prism Launcher meminta Anda menggunakan Java 8 di 1.16.X, tetapi Minecraft 1.16.5+, semua mod 1.18+, dan sebagian besar mod 1.16.5 kompatibel dengan Jawa 17.
Terkadang Java 11 berfungsi sedangkan Java 17 tidak.
1.12.2 dan di bawahnya umumnya memerlukan Java 8.
Runtime Java dari Azul, Microsoft, Adoptium, Amazon, dan sebagainya pada dasarnya identik. Beberapa pengecualian penting:
Oracle GraalVM Enterprise Edition memiliki fitur kompiler Java yang lebih agresif. Dengan inilah saya pribadi menjalankan Minecraft, lihat bagian GraalVM di bawah.
Clear Linux OpenJDK dari Intel menggunakan kode yang sama seperti OpenJDK lainnya (sehingga sangat kompatibel), tetapi proses pembuatannya sendiri dan dependensinya dioptimalkan untuk CPU yang lebih baru. Ambil dari repo Clear Linux melalui swupd
, dari Distrobox, atau dari Docker. Perhatikan bahwa Anda harus memutar kembali ke rilis Java 17, dan Java 18 mengembalikan beberapa peningkatan kinerja.
Prime OpenJDK Azul sangat cepat karena terhubung ke llvm, tetapi saat ini tidak kompatibel dengan sebagian besar mod dan hanya untuk linux. Dapatkan dari sini: https://docs.azul.com/prime/prime-quick-start-tar
Red Hat Java 8 memiliki pengumpul sampah Shenandoah. Ada gerbang di balik pendaftaran email gratis: https://developers.redhat.com/products/openjdk/download
OpenJ9 IBM ... jauh lebih lambat di Minecraft, dan menggunakan flag yang sangat berbeda dibandingkan build Java lainnya, tetapi ia mengonsumsi lebih sedikit memori dibandingkan runtime berbasis OpenJDK. Lihat FAQ, folder Benchmarks, dan Intisari ini untuk mengetahui tanda konsumsi memori rendah.
Jika Anda tidak tahu harus memilih apa, saya merekomendasikan GraalVM EE (lihat di bawah) atau Adoptium Java 17 JRE terbaru: https://adoptium.net/
Couleur menyimpan daftar JRE yang berjalan dengan baik di sini: https://rentry.co/JREs
Flag yang dioptimalkan ini dijalankan dengan build Java 11+ apa pun. Mereka bekerja di server dan klien:
-XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseNUMA -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseVectorCmov -XX:+PerfDisableSharedMem -XX:+UseFastUnorderedTimeStamps -XX:+UseCriticalJavaThreadPriority -XX:ThreadPriorityPolicy=1 -XX:AllocatePrefetchStyle=3
Anda harus menambahkan tanda pengumpulan sampah ke argumen java ini.
-Xmx8G -Xms8G -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseNUMA -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseVectorCmov -XX:+PerfDisableSharedMem -XX:+UseFastUnorderedTimeStamps -XX:+UseCriticalJavaThreadPriority -XX:ThreadPriorityPolicy=1 -XX:AllocatePrefetchStyle=3 -XX:+UseG1GC -XX:MaxGCPauseMillis=37 -XX:+PerfDisableSharedMem -XX:G1HeapRegionSize=16M -XX:G1NewSizePercent=23 -XX:G1ReservePercent=20 -XX:SurvivorRatio=32 -XX:G1MixedGCCountTarget=3 -XX:G1HeapWastePercent=20 -XX:InitiatingHeapOccupancyPercent=10 -XX:G1RSetUpdatingPauseTimePercent=0 -XX:MaxTenuringThreshold=1 -XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5.0 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150 -XX:GCTimeRatio=99 -XX:+UseLargePages -XX:LargePageSizeInBytes=2m
Memori minimum dan maksimum ( -xms
dan -xmx
) harus disetel ke nilai yang sama, seperti yang dijelaskan di sini: https://dzone.com/articles/benefits-of-setting-initial-and-maximum-memory-siz
Satu pengecualian: jika Anda menggunakan sistem dengan memori rendah, dan Minecraft menggunakan hampir seluruh RAM, setel memori minimum di bawah memori maksimum untuk menghemat sebanyak mungkin.
Ukuran diatur dalam megabyte ( -Xms4096M
) atau gigabyte ( -Xmx8G
)
Mengalokasikan terlalu banyak memori dapat merusak gc atau memperlambat Minecraft, meskipun Anda memiliki banyak memori tersisa. Mengalokasikan terlalu sedikit juga dapat memperlambat atau merusak permainan. Awasi pengelola Tugas Windows (atau monitor sistem DE Anda) saat Minecraft sedang berjalan, dan alokasikan hanya sebanyak yang dibutuhkan (yang biasanya kurang dari 8G). sparkc gcmonitor
akan memberi tahu Anda jika alokasi Anda terlalu tinggi (jeda akan terlalu lama) atau terlalu rendah (sering terjadi GC dengan peringatan memori rendah di notifikasi).
Bendera pengumpulan sampah harus ditambahkan ke server dan klien Minecraft , karena "jeda" default untuk menghentikan dan mengumpulkan sampah muncul sebagai gangguan pada klien dan kelambatan di server. Gunakan perintah /sparkc gcmonitor
di mod Spark untuk mengamati jeda dalam game. Jeda generasi lama adalah hal yang buruk, dan pengumpulan G1GC generasi muda seharusnya jarang dilakukan, namun cukup singkat sehingga tidak terlihat.
Pilih satu set bendera. Saya merekomendasikan Shenandoah di klien , ZGC di server Java 17 yang kuat , dan G1GC di Graal atau di server/klien dengan RAM lebih sedikit dan inti lebih sedikit:
ZGC sangat bagus untuk server dengan memori tinggi/jumlah inti tinggi. Tidak ada throughput server yang dapat saya ukur, dan sama sekali tidak tersendat. Namun, ini memerlukan lebih banyak RAM dan lebih banyak inti dibandingkan pengumpul sampah lainnya.
Sayangnya, ia mendapat hit FPS klien yang signifikan di laptop saya (8-core/16 thread). Lihat benchmark "ZGC" di folder benchmark. Ini tidak tersedia di Java 8, dan kinerjanya jauh lebih rendah di Java 11 dibandingkan di Java 17.
-XX:+UseZGC -XX:AllocatePrefetchStyle=1 -XX:-ZProactive
mengaktifkannya, tetapi mengalokasikan lebih banyak RAM dan lebih banyak ConcGCThreads
daripada biasanya untuk GC lainnya. Perhatikan bahwa ZGC tidak menyukai AllocationPrefetchStyle=3, sehingga menyetelnya ke 1 akan menggantikan entri sebelumnya. kamu
Shenandoah berkinerja baik pada klien, tetapi mematikan throughput server dalam pengujian saya. Aktifkan dengan -XX:+UseShenandoahGC -XX:ShenandoahGCMode=iu -XX:ShenandoahGuaranteedGCInterval=1000000 -XX:AllocatePrefetchStyle=1
Lihat opsi penyetelan lainnya di sini. Opsi "herustic" dan "mode" tidak banyak berubah bagi saya (kecuali untuk "kompak", yang sebaiknya tidak Anda gunakan). Seperti ZGC, Shenandoah tidak menyukai AllocationPrefetchStyle=3.
Perhatikan bahwa Shenandoah tidak ada di Java 8. Ini juga tidak ada di build Oracle Java mana pun! Jika Anda pengguna Java 8, Anda harus menggunakan Red Hat OpenJDK untuk menggunakan Shenandoah: https://developers.redhat.com/products/openjdk/download
G1GC adalah pengumpul sampah default, dan satu-satunya pengumpul sampah yang tersedia untuk pengguna GraalVM. Argumen G1GC server Minecraft Aikar yang terkenal berjalan dengan baik pada klien, dengan dua peringatan: argumen tersebut secara efektif menjepit parameter MaxGCPauseMillis
dengan menyetel G1NewSizePercent
begitu tinggi, menghasilkan gagap yang lama pada beberapa klien, dan mereka mengumpulkan sampah lama terlalu agresif (karena klien menghasilkan jauh lebih sedikit daripada a server yang dihuni).
Ini mirip dengan bendera aikar, tetapi dengan jeda yang lebih pendek dan lebih sering, pengumpulan campuran G1 yang kurang agresif, dan pengumpulan latar belakang yang lebih agresif: -XX:+UseG1GC -XX:MaxGCPauseMillis=37 -XX:+PerfDisableSharedMem -XX:G1HeapRegionSize=16M -XX:G1NewSizePercent=23 -XX:G1ReservePercent=20 -XX:SurvivorRatio=32 -XX:G1MixedGCCountTarget=3 -XX:G1HeapWastePercent=20 -XX:InitiatingHeapOccupancyPercent=10 -XX:G1RSetUpdatingPauseTimePercent=0 -XX:MaxTenuringThreshold=1 -XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5.0 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150 -XX:GCTimeRatio=99
G1NewSizePercent
dan MaxGCPauseMillis
dapat digunakan untuk mengatur frekuensi/durasi koleksi generasi muda Anda. G1HeapWastePercent=18
harus dihapus jika Anda mendapatkan jeda generasi lama pada pengaturan Anda. Alternatifnya, Anda dapat menaikkannya dan menyetel G1MixedGCCountTarget
ke 2 atau 1 untuk membuat pengumpulan sampah campuran menjadi lebih lambat (dengan mengorbankan penggunaan memori yang lebih tinggi).
Jeda yang lebih lama lebih dapat diterima di server. Bendera ini sangat mirip dengan default aikar:
-XX:+UseG1GC -XX:MaxGCPauseMillis=130 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=28 -XX:G1HeapRegionSize=16M -XX:G1ReservePercent=20 -XX:G1MixedGCCountTarget=3 -XX:InitiatingHeapOccupancyPercent=10 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=0 -XX:SurvivorRatio=32 -XX:MaxTenuringThreshold=1 -XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150
-XX:ConcGCThreads=[Some Number]
mengontrol jumlah maksimum thread latar belakang yang boleh digunakan oleh pengumpul sampah, dan defaultnya adalah logical (hyperthreaded) cores / 4
. Versi terbaru Java akan mengurangi jumlah thread gc, jika diperlukan.
Dalam beberapa kasus (terutama dengan ZGC atau Shenandoh) Anda ingin meningkatkan batas thread ini melewati default. Saya merekomendasikan "2" pada CPU dengan 4 thread, dan [number of real cores - 2]
pada sebagian besar CPU lainnya, tetapi Anda mungkin perlu bermain-main dengan parameter ini. Jika terlalu rendah, pengumpulan sampah tidak dapat mengimbangi Minecraft, dan game akan tersendat-sendat dan/atau mulai memakan banyak RAM dan crash. Jika terlalu tinggi, mungkin akan memperlambat permainan, terutama jika Anda menjalankan Java 8.
Tidak diperlukan tanda "threading" lain seperti ParallelGCThreads
atau JVMCIThreads
, karena diaktifkan secara default dengan pengaturan otomatis yang baik di Java 8+.
CATATAN: Halaman Besar memerlukan hak istimewa admin di Windows. Ini adalah risiko keamanan, dan Anda harus melewati bagian ini jika Anda merasa tidak nyaman dengan hal itu.
Mengaktifkan halaman besar akan meningkatkan kinerja server dan klien Minecraft. Berikut beberapa tutorial bagus untuk mengaktifkannya:
Di Windows, Anda harus menjalankan java, dan peluncur Anda, sebagai administrator. Itu berarti mencentang kotak kompatibilitas "jalankan sebagai administrator" untuk javaw.exe
, java.exe
dan your launcher.exe
, jika tidak, Halaman Besar akan gagal secara diam-diam. Tambahkan -XX:+UseLargePages -XX:LargePageSizeInBytes=2m
ke argumen Anda.
Di linux, biasanya Anda ingin menggunakan -XX:+UseTransparentHugePages
. Untuk mengalokasikan memori secara manual (untuk peningkatan kinerja yang lebih besar), Red Hat memiliki tutorial yang bagus untuk distro linux mirip RHEL, seperti Fedora, CentOS, atau Oracle Linux: https://www.redhat.com/en/blog/optimizing -rhel-8-jalankan-java-implementasi-minecraft-server
Periksa dan lihat apakah halaman besar berfungsi dengan argumen -Xlog:gc+init
java di Java 17.
Di versi/platform Java apa pun, jika halaman besar tidak berfungsi, Anda akan mendapat peringatan di log seperti ini:
Peringatan Java HotSpot(TM) 64-Bit Server VM: JVM tidak dapat menggunakan memori halaman yang besar karena tidak memiliki cukup hak istimewa untuk mengunci halaman di memori.
GraalVM adalah Java VM baru dari Oracle yang dapat meningkatkan kinerja Minecraft (modded dan vanilla). Meskipun peningkatan FPS klien tidak terlalu besar, beban kerja sisi server seperti pembuatan bongkahan dapat memperoleh peningkatan sebesar 20%+!
Hanya GraalVM Enterprise Edition yang hadir dengan serangkaian pengoptimalan lengkap. Unduh melalui tautan langsung dari Oracle:
Windows AMD64 (64-bit): https://oca.opensource.Oracle.com/gds/GRAALVM_EE_JAVA17_22_3_1/graalvm-ee-java17-windows-amd64-22.3.1.zip
Linux AMD64 (64-bit): https://oca.opensource.Oracle.com/gds/GRAALVM_EE_JAVA17_22_3_1/graalvm-ee-java17-linux-amd64-22.3.1.tar.gz
Linux AARCH64 (ARM 64-bit): https://oca.opensource.Oracle.com/gds/GRAALVM_EE_JAVA17_22_3_1/graalvm-ee-java17-linux-aarch64-22.3.1.tar.gz
Mac AMD64 (64-bit): https://oca.opensource.Oracle.com/gds/GRAALVM_EE_JAVA17_22_3_1/graalvm-ee-java17-darwin-amd64-22.3.1.tar.gz
Windows AMD64 (64-bit): https://oca.opensource.Oracle.com/gds/GRAALVM_EE_JAVA11_22_3_1/graalvm-ee-java11-windows-amd64-22.3.1.zip
Linux AMD64 (64-bit): https://oca.opensource.Oracle.com/gds/GRAALVM_EE_JAVA11_22_3_1/graalvm-ee-java11-linux-amd64-22.3.1.tar.gz
Linux AARCH64 (ARM 64-bit): https://oca.opensource.Oracle.com/gds/GRAALVM_EE_JAVA11_22_3_1/graalvm-ee-java11-linux-aarch64-22.3.1.tar.gz
Mac AMD64 (64-bit): https://oca.opensource.Oracle.com/gds/GRAALVM_EE_JAVA11_22_3_1/graalvm-ee-java11-darwin-amd64-22.3.1.tar.gz
Windows AMD64 (64-bit): https://oca.opensource.Oracle.com/gds/GRAALVM_EE_JAVA8_21_3_5/graalvm-ee-java8-windows-amd64-21.3.5.zip
Linux AMD64 (64-bit): https://oca.opensource.Oracle.com/gds/GRAALVM_EE_JAVA8_21_3_5/graalvm-ee-java8-linux-amd64-21.3.5.tar.gz
Mac AMD64 (64-bit): https://oca.opensource.Oracle.com/gds/GRAALVM_EE_JAVA8_21_3_5/graalvm-ee-java8-darwin-amd64-21.3.5.tar.gz
(Versi GraalVM EE tertentu juga tersedia di AUR dan repo Oracle Linux)
Versi baru untuk ARM Mac memerlukan pendaftaran gratis di halaman unduh utama Oracle: https://www.oracle.com/downloads/graalvm-downloads.html
Rilis ini bukan installer Java. Anda perlu mengganti versi Java peluncur Anda secara manual, atau menggunakan peluncur Minecraft yang mendukung penentuan jalur Java Anda. Saya merekomendasikan ATLauncher, Prism Launcher atau GDLauncher. Saat menentukan jalur java, navigasikan ke folder "bin" di unduhan GraalVM dan gunakan "javaw.exe" atau "java.exe".
Untuk server, Anda perlu mengganti perintah "java" di file sh/bat awal server Anda dengan path lengkap ke graalvm java, dalam tanda kutip.
Alternatifnya, Anda dapat menginstalnya di seluruh sistem dengan mengikuti panduan Oracle: https://www.graalvm.org/22.2/docs/getting-started/#install-graalvm
Argumen untuk GraalVM EE 22+ Java 17 (atau Java 11):
-XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseNUMA -XX:AllocatePrefetchStyle=3 -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M -XX:-DontCompileHugeMethods -XX:+PerfDisableSharedMem -XX:+UseFastUnorderedTimeStamps -XX:+UseCriticalJavaThreadPriority -XX:+EagerJVMCI -Dgraal.TuneInlinerExploration=1 -Dgraal.CompilerConfiguration=enterprise
Anda harus menggunakan G1GC dengan argumen ini. GraalVM saat ini tidak berfungsi dengan ZGC atau Shenandoah.
GraalVM EE 22.3.0 memperbaiki semua bug Minecraft yang diketahui
Jika Anda menjalankan GraalVM versi lama berbasis Java 8, ada beberapa potensi masalah:
VectorizeSIMD
mengubah entitas menjadi tidak terlihat dengan mod shader seperti Optifine, Iris atau Occulus... tetapi hanya dalam kondisi tertentu. Ini akan diperbaiki di GraalVM EE 22.3.0. Lihat: Oracle/graal#4849
GraalVM CE dan EE keduanya mematahkan rendering konstelasi di 1.16.5 Astral Sorcery. Ini mungkin terkait dengan bug shader. Lihat: HellFirePvP/AstralSorcery#1963
Saya belum melihat adanya bug di sisi server.
Jika Anda mengalami masalah mod lain yang dapat Anda lacak kembali ke GraalVM, buat masalah Github atau posting di Discord! Secara umum, Anda dapat mengatasinya dengan menonaktifkan tanda pengoptimalan dgraal
utama, atau dengan menemukan fungsi yang tepat dengan Dgraal.PrintCompilation=true
, dan mengatasinya dengan -Dgraal.GraalCompileOnly=~...
setelah Anda menemukan fungsi yang salah dikompilasi.
Mod Windows "universal" yang mirip dengan ReShade, SpecialK memiliki 2 keunggulan kinerja utama:
Pembatas bingkai "pintar" yang mengurangi stutter, menghilangkan robekan, menghemat daya, dan menghemat TDP CPU untuk ditingkatkan bila diperlukan. Ia bahkan bekerja bersama dengan VRR atau Nvidia Reflex.
Wrapper OpenGL-ke-DirectX11 yang disebut OpenGL-IK yang menghilangkan overhead mode berjendela Minecraft, dan mengaktifkan fitur lain (seperti HDR otomatis atau jendela tanpa batas yang dapat diubah ukurannya).
Unduh di sini: https://wiki.special-k.info/en/SpecialK/Tools
Tambahkan peluncur MC Anda, dan centang kotak "layanan yang ditingkatkan". Kemudian navigasikan ke folder java bin tempat javaw.exe Anda berada, dan buat file kosong bernama SpecialK.OpenGL32
. Luncurkan peluncur Minecraft Anda dengan peluncur SpecialK, dan peluncur tersebut kemudian akan "menyuntikkan" SpecialK ke Minecraft.
Anda dapat membuat pintasan desktop ke peluncur Minecraft melalui UI SpecialK untuk kenyamanan lebih.
Pastikan untuk mematikan VSync dan pembatas bingkai Minecraft dalam game.
Seorang pengguna melaporkan penurunan FPS saat menjalankan SpecialK. Jika ini terjadi pada Anda, beri tahu saya melalui Discord atau Github!
Setelah meluncurkan Minecraft, atur Java agar berjalan pada prioritas proses "Di Atas Normal" di Windows dengan Task Manager:
Pengguna Linux dapat menambahkan sudo nice -n -10
di awal perintah peluncuran, tetapi perhatikan bahwa level Nice di bawah 0 (dengan "maks" -20) memerlukan menjalankan Minecraft sebagai sudo
. Alternatifnya, gunakan perintah renice
setelah meluncurkan Minecraft untuk menghindari risiko keamanan ini.
Ini adalah repo fantastis untuk menemukan mod kinerja: https://github.com/NordicGamerFE/usefulmods
Daripada Optifine, saya akan merekomendasikan alternatif yang lebih kompatibel seperti Sodium + Iris atau Rubidium + Oculus.
Saya sarankan menggunakan Java 17 atau, jika gagal, Java 11 kecuali 8 benar-benar diperlukan. Namun jika ya, flag ini akan berfungsi dengan OpenJDK8, bersama dengan Shenandoh GC (untuk Red Hat OpenJDK pada klien) atau G1GC (untuk yang lainnya):
-XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+ParallelRefProcEnabled -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:+PerfDisableSharedMem -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:MaxInlineLevel=15 -XX:MaxVectorSize=32 -XX:+UseCompressedOops -XX:ThreadPriorityPolicy=1 -XX:+UseNUMA -XX:+UseDynamicNumberOfGCThreads -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=350M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseFPUForSpilling -Dgraal.CompilerConfiguration=community
Pengguna x86 Java 8 (alias sebagian besar pengguna Java 8) dapat menambahkan argumen tambahan berikut:
-XX:+UseXMMForArrayCopy
Anda juga bisa mendapatkan GraalVM EE versi Java 8 dari bagian 21.X di situs Oracle, dan menggunakan argumen berikut:
-XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+ParallelRefProcEnabled -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:AllocatePrefetchStyle=1 -XX:ThreadPriorityPolicy=1 -XX:+UseNUMA -XX:+UseDynamicNumberOfGCThreads -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=350M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseFPUForSpilling -XX:+EnableJVMCI -XX:+UseJVMCICompiler -XX:+EagerJVMCI -Dgraal.TuneInlinerExploration=1 -Dgraal.CompilerConfiguration=enterprise -Dgraal.UsePriorityInlining=true -Dgraal.Vectorization=true -Dgraal.OptDuplication=true -Dgraal.DetectInvertedLoopsAsCounted=true -Dgraal.LoopInversion=true -Dgraal.VectorizeHashes=true -Dgraal.EnterprisePartialUnroll=true -Dgraal.VectorizeSIMD=true -Dgraal.StripMineNonCountedLoops=true -Dgraal.SpeculativeGuardMovement=true -Dgraal.InfeasiblePathCorrelation=true
Pastikan untuk menyetel -Dgraal.VectorizeSIMD
ke false
jika Anda menjalankan shader.
Jalankan server Minecraft Anda di Clear Linux! Sejauh ini, ini adalah distribusi linux yang paling optimal, dan memiliki beberapa fitur bagus lainnya (seperti sistem konfigurasi stateless). Ini juga menjalankan klien pada GPU AMD/Intel dengan cukup baik: https://web.archive.org/web/20220916090057/https://docs.01.org/clearlinux/latest/tutorials/multi-boot/dual-boot- menang.html
Oracle Linux juga merupakan pilihan yang baik untuk server, karena sudah dioptimalkan dengan cukup baik dan memiliki Graalvm EE yang tersedia melalui manajer paket. Untuk klien, distro berbasis Arch seperti CachyOS atau EndeavourOS sangat bagus karena memiliki dukungan luas untuk sebagian besar perangkat keras.
Pastikan klien Minecraft menggunakan GPU diskrit Anda! Periksa tab F3, dan paksa Minecraft untuk menggunakannya di " Pengaturan Grafik Windows ", bukan di panel kontrol AMD/Nvidia (karena sepertinya tidak berfungsi lagi).
Pengguna Linux klien Minecraft harus memeriksa https://github.com/Admicos/minecraft-wayland
Tutup semua yang ada di latar belakang, termasuk Discord, peluncur game, dan browser Anda! Minecraft membutuhkan banyak sumber daya, dan tidak menyukai aplikasi lain yang menimbulkan gangguan CPU atau memakan I/O disk, RAM, dan sebagainya.
Java 18/19 memiliki beberapa ketidakcocokan mod. Mereka dilaporkan bekerja dengan beberapa modpack, tapi saya tidak yakin apakah ada manfaat kinerjanya.
Perubahan Java meningkatkan kinerja server dan kegagapan klien, tetapi tidak banyak meningkatkan rata-rata FPS klien (jika ada). Untuk itu, menjalankan driver grafis dan mod kinerja yang benar/terkini jauh lebih penting: https://github.com/NordicGamerFE/usefulmods
Panduan ini mengasumsikan Anda memiliki sedikit RAM cadangan saat menjalankan Minecraft. Jika pengaturan Anda terbatas pada RAM, coba hapus argumen berikut khususnya: -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M
, dan coba server G1GC argumen.
OpenJ9 IBM memang menghemat RAM, seperti yang ditunjukkan oleh reputasinya, tetapi lebih lambat 30% di server chunkgen dalam pengujian saya. Jika ada tanda yang membuatnya bersaing dengan OpenJDK, beri tahu saya di Discord atau di sini: #9
-XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions
cukup membuka lebih banyak tanda untuk digunakan. Ini dapat dicantumkan dengan flag -XX:+PrintFlagsFinal
dan -XX:+JVMCIPrintProperties
, lihat Flag Dumps-XX:G1MixedGCCountTarget=3
: Ini adalah jumlah blok gc generasi lama yang akan ditargetkan dalam gc "campuran". Koleksi campuran ini jauh lebih lambat, dan klien Minecraft tidak menghasilkan generasi lama dengan sangat cepat, jadi kami dapat menurunkan nilai ini menjadi 3, 2, atau bahkan 1 untuk jeda GC yang lebih pendek.-XX:+UseNUMA
memungkinkan optimasi untuk sistem multisocket, jika berlaku. Tidak yakin apakah ini berlaku untuk CPU MCM seperti Ryzen atau Epyc, tetapi ini dinonaktifkan secara otomatis jika tidak berlaku.-XX:-DontCompileHugeMethods
Memungkinkan metode berukuran besar untuk dikompilasi. Minecraft yang dimodifikasi memiliki beberapa di antaranya, dan kami tidak peduli dengan penggunaan CPU kompiler latar belakang yang lebih tinggi.-XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000
Mengaktifkan pengoptimalan metode yang lebih besar. Lihat: https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8058148-XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M
menyediakan lebih banyak ruang untuk kode yang dikompilasi. Semua bagian harus "ditambahkan" ke ReservedCodeCacheSize
. Saya telah mengamati Minecraft yang dimodifikasi berjalan ke batas default 250 megabyte dengan XX:+PrintCodeCache
, tetapi meskipun tidak diisi, ukurannya yang lebih besar membuat pengusiran kode yang dikompilasi menjadi kurang agresif.-XX:NmethodSweepActivity=1
(default 10) menyimpan kode "dingin" di cache untuk waktu yang lebih lama. Tidak ada risiko "mengisi" cache kode, karena kode dingin dihapus secara lebih agresif saat terisi.-XX:+UseStringDeduplication
-XX:+UseFastUnorderedTimeStamps
Hindari panggilan sistem untuk mendapatkan waktu. Dampaknya akan berbeda-beda di setiap sistem, namun kami tidak terlalu peduli dengan keakuratan stempel waktu pencatatan.-XX:+UseCriticalJavaThreadPriority
Tidak ada yang dapat mendahului thread Minecraft. Thread GC dan Compiler bisa menunggu.-XX:ThreadPriorityPolicy=1
Gunakan prioritas thread yang lebih luas. Membutuhkan sudo di linux agar berfungsi. Beberapa JDK (seperti Graal) mengaktifkan ini secara default, namun beberapa tidak.-XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150
: Mengoptimalkan thread pengumpulan bersamaan G1GC, yang masih diuji: https://research.spec.org/icpe_proceedings/2014/p111.pdf-XX:G1RSetUpdatingPauseTimePercent=0
: Kami ingin semua pekerjaan ini dilakukan di thread bersamaan G1GC, bukan jeda.-XX:G1HeapWastePercent=18
Jangan repot-repot mengumpulkan dari generasi lama hingga persentasenya di atas ini. Hal ini untuk menghindari pemicuan GC generasi muda "campuran" yang lebih lambat, yang tidak masalah karena Minecraft (dengan memori yang cukup) tidak mengisi gen lama secepat itu. Ide dari: https://www.reddit.com/r/Minecraft/comments/k9zb7m/tuning_jvm_gc_for_singleplayer/-XX:GCTimeRatio=99
Sebagai sasaran, 1% waktu CPU harus dihabiskan untuk pengumpulan sampah. Standarnya adalah 12, yang tampaknya terlalu rendah. Default untuk Java 8 adalah 99.-XX:AllocatePrefetchStyle=3
Hasilkan satu instruksi prefetch per baris cache. Pengambilan awal yang lebih agresif umumnya berguna pada CPU baru dengan cache yang besar. Tampaknya merusak ZGC. Lihat: https://github.com/openjdk/jdk/blob/bd90c4cfa63ba2de26f7482ed5d1704f9be9629f/src/hotspot/share/opto/macro.cpp#L1806-Dgraal.LoopRotation=true
Optimasi non default, mungkin akan segera menjadi default.-Dgraal.TuneInlinerExploration=1
Luangkan lebih banyak waktu untuk membuat keputusan yang sejalan. Untuk Minecraft, kami ingin kompiler C2 menjadi selambat dan seagresif mungkin.-Dgraal
lainnya diaktifkan secara default, dan ada sebagai pemeriksaan kewarasan, untuk debugging, atau sebagai pengaman kegagalan (jika, misalnya, seseorang tanpa sadar menonaktifkan JVCMI dengan beberapa tanda lain).-XX:MaxInlineLevel=15 -XX:MaxVectorSize=32
) baru saja disalin dari default Java 17. Lainnya (seperti +AggressiveOpts
) hanya bersifat non-default di beberapa versi Java 8 lama.-Dgraal.BaseTargetSpending=160
(default 120) di Graal dan beberapa flag lainnya di OpenJDK. CPU dengan cache yang lebih besar mungkin mendapatkan keuntungan dari hal ini.-XX:+AlignVector -XX:+OptoBundling -XX:+OptimizeFill -XX:+AlwaysCompileLoopMethods -XX:+EnableVectorAggressiveReboxing -XX:+EnableVectorSupport -XX:+OptoScheduling -XX:+UseCharacterCompareIntrinsics -XX:+UseCopySignIntrinsic -XX:+UseVectorStubs
-Dgraal.LSRAOptimization=true
-Dgraal.OptWriteMotion=true
dan graal.WriteableCodeCache=true
, yang tampaknya tidak stabil, tetapi mungkin lebih stabil di GraalVM 22.3.0G1HeapWastePercent
yang ekstrim.-XX:+PrintFlagsFinal
dan -XX:+JVMCIPrintProperties
untuk membuang deskripsi/default flag.