Esta es una guía para ajustar Java para Minecraft. Cada indicador y ajuste se compara individualmente para probar las regresiones y se compara con los valores predeterminados de Java para evitar la redundancia.
Si bien estos ajustes reducen notablemente algunas tartamudeos del servidor y del cliente, espere solo ganancias modestas de TPS + ganancias mínimas de FPS en el mejor de los casos, y un uso algo mayor de RAM + CPU. Y no sustituyen la eliminación de retrasos con modificaciones como Spark u Observable.
Discord para preguntas y cosas así: https://discord.gg/zeFSR9PnUw
Todos los indicadores se prueban con el script Benchmark.py. Consulte el trabajo en progreso Benchmarks.md.
Para Minecraft 1.16.5 y versiones posteriores, use Java 17. Algunos lanzadores como Curseforge y Prism Launcher le piden que use Java 8 en 1.16.X, pero Minecraft 1.16.5+, todas las modificaciones 1.18+ y la mayoría de las modificaciones 1.16.5 son compatibles. con Java 17.
A veces, Java 11 funcionará donde Java 17 no.
1.12.2 y anteriores generalmente requieren Java 8.
Los tiempos de ejecución de Java de Azul, Microsoft, Adoptium, Amazon, etc. son básicamente idénticos. Algunas excepciones notables:
Oracle GraalVM Enterprise Edition presenta un compilador de Java más agresivo. Esto es con lo que personalmente ejecuto Minecraft; consulte la sección GraalVM a continuación.
Clear Linux OpenJDK de Intel utiliza el mismo código que cualquier otro OpenJDK (lo que lo hace altamente compatible), pero el proceso de compilación en sí y las dependencias están optimizados para CPU más nuevas. Consíguelo de los repositorios de Clear Linux a través de swupd
, de Distrobox o de Docker. Tenga en cuenta que debe volver a la versión Java 17 y que Java 18 revierte algunas de las mejoras de rendimiento.
Prime OpenJDK de Azul es muy rápido ya que se conecta a llvm, pero actualmente es incompatible con la mayoría de las modificaciones y es solo para Linux. Consíguelo desde aquí: https://docs.azul.com/prime/prime-quick-start-tar
Red Hat Java 8 tiene el recolector de basura Shenandoah. Está cerrado detrás de un registro de correo electrónico gratuito: https://developers.redhat.com/products/openjdk/download
OpenJ9 de IBM es... mucho más lento en Minecraft y utiliza indicadores totalmente diferentes que cualquier otra compilación de Java, pero consume menos memoria que los tiempos de ejecución basados en OpenJDK. Consulte las preguntas frecuentes, la carpeta Benchmarks y este Gist para conocer los indicadores de bajo consumo de memoria.
Si no sabe qué elegir, le recomiendo GraalVM EE (ver más abajo) o la última versión de Adoptium Java 17 JRE: https://adoptium.net/
Couleur mantiene una buena lista actualizada de JRE aquí: https://rentry.co/JREs
Estos indicadores optimizados se ejecutan con cualquier compilación de Java 11+. Funcionan tanto en servidores como en clientes:
-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
Debe agregar indicadores de recolección de basura a estos argumentos de Java.
-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
La memoria mínima y máxima ( -xms
y -xmx
) se deben establecer en el mismo valor, como se explica aquí: https://dzone.com/articles/benefits-of-setting-initial-and-maximum-memory-siz
Una excepción: si tienes un sistema con poca memoria y Minecraft ocupa casi toda tu RAM, configura tu memoria mínima por debajo de tu memoria máxima para conservar la mayor cantidad posible.
Los tamaños se establecen en megabytes ( -Xms4096M
) o gigabytes ( -Xmx8G
)
Asignar demasiada memoria puede dañar gc o simplemente ralentizar Minecraft, incluso si tienes suficiente de sobra. Asignar muy poco también puede ralentizar o interrumpir el juego. Esté atento al administrador de tareas de Windows (o al monitor del sistema de su DE) mientras Minecraft se está ejecutando y asigne solo lo que necesite (que generalmente es menos de 8G). sparkc gcmonitor
le dirá si su asignación es demasiado alta (las pausas serán demasiado largas) o demasiado baja (GC frecuente con una advertencia de poca memoria en la notificación).
Se deben agregar indicadores de recolección de basura a los servidores y clientes de Minecraft , como las "pausas" predeterminadas para detener y recolectar el manifiesto de basura como tartamudeo en el cliente y retraso en los servidores. Utilice el comando /sparkc gcmonitor
en el mod Spark para observar las pausas en el juego. Cualquier pausa en la generación anterior es mala, y las colecciones de G1GC de la generación joven deberían ser poco frecuentes, pero lo suficientemente breves como para ser imperceptibles.
Elige un conjunto de banderas. Recomiendo Shenandoah en clientes , ZGC en potentes servidores Java 17 y G1GC en Graal o en servidores/clientes con menos RAM y menos núcleos:
ZGC es ideal para servidores con mucha memoria y gran cantidad de núcleos. No tiene ningún impacto en el rendimiento del servidor que pueda medir y no tartamudea en absoluto. Sin embargo, requiere más RAM y más núcleos que otros recolectores de basura.
Desafortunadamente, tiene un importante impacto en FPS del cliente en mi computadora portátil (8 núcleos/16 subprocesos). Consulte el punto de referencia "ZGC" en la carpeta de puntos de referencia. No está disponible en Java 8 y tiene mucho menos rendimiento en Java 11 que en Java 17.
-XX:+UseZGC -XX:AllocatePrefetchStyle=1 -XX:-ZProactive
lo habilita, pero asigna más RAM y más ConcGCThreads
de lo que normalmente haría para otros GC. Tenga en cuenta que a ZGC no le gusta AllocatePrefetchStyle=3, por lo que establecerlo en 1 anula la entrada anterior. Ud.
Shenandoah funciona bien en los clientes, pero reduce el rendimiento del servidor en mis pruebas. Habilítelo con -XX:+UseShenandoahGC -XX:ShenandoahGCMode=iu -XX:ShenandoahGuaranteedGCInterval=1000000 -XX:AllocatePrefetchStyle=1
Vea más opciones de ajuste aquí. Las opciones "herústica" y "modo" no cambian mucho para mí (excepto "compacto", que no deberías usar). Al igual que ZGC, a Shenandoah no le gusta AllocatePrefetchStyle=3.
Tenga en cuenta que Shenandoah no está en Java 8. ¡Tampoco está en ninguna compilación de Oracle Java! Si es usuario de Java 8, debe utilizar Red Hat OpenJDK para utilizar Shenandoah: https://developers.redhat.com/products/openjdk/download
G1GC es el recolector de basura predeterminado y es el único recolector de basura disponible para los usuarios de GraalVM. Los famosos argumentos G1GC del servidor Minecraft de Aikar funcionan muy bien en los clientes, con dos advertencias: bloquean efectivamente el parámetro MaxGCPauseMillis
al establecer G1NewSizePercent
en un nivel tan alto, lo que produce largos tartamudeos en algunos clientes, y recolectan basura antigua de manera demasiado agresiva (ya que el cliente produce mucho menos que un servidor poblado).
Son similares a las banderas aikar, pero con pausas más cortas y frecuentes, una colección mixta G1 menos agresiva y una colección de fondo más agresiva: -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
y MaxGCPauseMillis
se pueden utilizar para ajustar la frecuencia/duración de las colecciones de la generación joven. G1HeapWastePercent=18
debe eliminarse si se producen pausas de generación anterior en la configuración. Alternativamente, puede aumentarlo y configurar G1MixedGCCountTarget
en 2 o 1 para hacer que la recolección de basura mixta sea aún más lenta (a costa de un mayor uso de memoria).
Las pausas más largas son más aceptables en los servidores. Estas banderas están muy cerca de los valores predeterminados de 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]
controla el número máximo de subprocesos en segundo plano que el recolector de basura puede usar y el valor predeterminado es logical (hyperthreaded) cores / 4
. Las versiones recientes de Java reducirán la cantidad de subprocesos de gc, si es necesario.
En algunos casos (especialmente con ZGC o Shenandoh), desea aumentar este límite de subproceso más allá del valor predeterminado. Recomiendo "2" en CPU con 4 subprocesos y [number of real cores - 2]
en la mayoría de las demás CPU, pero es posible que tengas que jugar con este parámetro. Si es demasiado bajo, la recolección de basura no puede seguir el ritmo de Minecraft, y el juego tartamudeará y/o comenzará a consumir grandes cantidades de RAM y fallará. Si es demasiado alto, podría ralentizar el juego, especialmente si estás ejecutando Java 8.
No son necesarios otros indicadores de "threading" como ParallelGCThreads
o JVMCIThreads
, ya que están habilitados de forma predeterminada con buenas configuraciones automáticas en Java 8+.
NOTA: Las páginas grandes requieren privilegios de administrador en Windows. Este es un riesgo para la seguridad y debe omitir esta sección si no se siente cómodo con eso.
Habilitar páginas grandes mejora el rendimiento de los servidores y clientes de Minecraft. Aquí hay algunos tutoriales excelentes para habilitarlo:
En Windows, debe ejecutar Java y su iniciador como administrador. Eso significa marcar la casilla de verificación de compatibilidad "ejecutar como administrador" para javaw.exe
, java.exe
y your launcher.exe
; de lo contrario, las páginas grandes fallarán silenciosamente. Agregue -XX:+UseLargePages -XX:LargePageSizeInBytes=2m
a sus argumentos.
En Linux, generalmente desea utilizar -XX:+UseTransparentHugePages
. Para asignar memoria manualmente (para un mayor aumento del rendimiento), Red Hat tiene un buen tutorial para distribuciones de Linux similares a RHEL, como Fedora, CentOS u Oracle Linux: https://www.redhat.com/en/blog/optimizing -rhel-8-ejecutar-implementación-java-servidor-minecraft
Verifique y vea si las páginas grandes funcionan con el argumento -Xlog:gc+init
java en Java 17.
En cualquier versión/plataforma de Java, si las páginas grandes no funcionan, recibirá una advertencia en el registro similar a esta:
Advertencia de VM del servidor Java HotSpot(TM) de 64 bits: JVM no puede utilizar una memoria de página grande porque no tiene privilegios suficientes para bloquear páginas en la memoria.
GraalVM es una nueva máquina virtual Java de Oracle que puede mejorar el rendimiento de Minecraft (modificado y básico). Si bien las ganancias de FPS del cliente son modestas, las cargas de trabajo del lado del servidor, como la generación de fragmentos, pueden obtener un aumento de más del 20 %.
Sólo GraalVM Enterprise Edition viene con el conjunto completo de optimizaciones. Descárguelo a través de enlaces directos desde Oracle:
Windows AMD64 (64 bits): https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA17_22_3_1/graalvm-ee-java17-windows-amd64-22.3.1.zip
Linux AMD64 (64 bits): 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 de 64 bits): 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 bits): 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 bits): https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA11_22_3_1/graalvm-ee-java11-windows-amd64-22.3.1.zip
Linux AMD64 (64 bits): 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 de 64 bits): 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 bits): 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 bits): https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA8_21_3_5/graalvm-ee-java8-windows-amd64-21.3.5.zip
Linux AMD64 (64 bits): 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 bits): https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA8_21_3_5/graalvm-ee-java8-darwin-amd64-21.3.5.tar.gz
(Algunas versiones de GraalVM EE también están disponibles en AUR y en los repositorios de Oracle Linux)
Las nuevas versiones para ARM Mac requieren un registro gratuito en la página principal de descarga de Oracle: https://www.oracle.com/downloads/graalvm-downloads.html
Estas versiones no son instaladores de Java. Debe reemplazar manualmente la versión de Java de su iniciador o usar un iniciador de Minecraft que admita la especificación de su ruta de Java. Recomiendo ATLauncher, Prism Launcher o GDLauncher. Al especificar una ruta de Java, navegue hasta la carpeta "bin" en la descarga de GraalVM y use "javaw.exe" o "java.exe".
Para los servidores, debe reemplazar el comando "java" en el archivo sh/bat de inicio de su servidor con la ruta completa a graalvm java, entre comillas.
Alternativamente, puede instalarlo en todo el sistema siguiendo la guía de Oracle: https://www.graalvm.org/22.2/docs/getting-started/#install-graalvm
Argumentos a favor de GraalVM EE 22+ Java 17 (o 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
Debes usar G1GC con estos argumentos. GraalVM actualmente no funciona con ZGC o Shenandoah.
GraalVM EE 22.3.0 corrige todos los errores conocidos de Minecraft
Si ejecuta una versión anterior de GraalVM basada en Java 8, existen algunos problemas potenciales:
VectorizeSIMD
vuelve invisibles las entidades con modificaciones de sombreado como Optifine, Iris u Occulus... pero sólo bajo ciertas condiciones. Esto se solucionará en GraalVM EE 22.3.0. Ver: oráculo/graal#4849
GraalVM CE y EE interrumpen la representación de constelaciones en 1.16.5 Astral Sorcery. Esto posiblemente esté relacionado con el error del sombreador. Ver: HellFirePvP/AstralSorcery#1963
Todavía no he observado ningún error del lado del servidor.
Si tiene algún otro problema de modificación que pueda rastrear hasta GraalVM, cree un problema de Github o publíquelo en Discord. Generalmente, puede solucionarlos deshabilitando los principales indicadores de optimización dgraal
o buscando la función correcta con Dgraal.PrintCompilation=true
y solucionándola con -Dgraal.GraalCompileOnly=~...
una vez que encuentre la función mal compilada.
SpecialK, un mod "universal" de Windows similar a ReShade, tiene 2 beneficios de rendimiento importantes:
Un limitador de fotogramas "inteligente" que reduce la tartamudez, elimina el desgarro, ahorra energía y guarda el TDP de la CPU para aumentarlo cuando sea necesario. Incluso funciona junto con VRR o Nvidia Reflex.
Un contenedor de OpenGL a DirectX11 llamado OpenGL-IK que elimina la sobrecarga del modo de ventana de Minecraft y habilita otras funciones (como HDR automático o una ventana sin bordes de tamaño variable).
Descárgalo aquí: https://wiki.special-k.info/en/SpecialK/Tools
Agregue su iniciador MC y marque la casilla de verificación "servicio elevado". Luego navegue hasta la carpeta bin de Java donde está su javaw.exe y cree un archivo vacío llamado SpecialK.OpenGL32
. Inicie su iniciador de Minecraft con el iniciador SpecialK, y el iniciador "inyectará" SpecialK en Minecraft.
Puedes crear un acceso directo en el escritorio a tu iniciador de Minecraft a través de la interfaz de usuario de SpecialK para mayor comodidad.
Asegúrate de desactivar VSync y el limitador de cuadros de Minecraft en el juego.
Un usuario informó una reducción de FPS al ejecutar SpecialK. Si esto te sucede, ¡házmelo saber a través de Discord o Github!
Después de iniciar Minecraft, configure Java para que se ejecute con una prioridad de proceso "superior a lo normal" en Windows con el Administrador de tareas:
Los usuarios de Linux pueden agregar sudo nice -n -10
al comienzo del comando de inicio, pero tenga en cuenta que los niveles nice por debajo de 0 (siendo el "máximo" -20) requieren ejecutar Minecraft como sudo
. Alternativamente, use el comando renice
después de iniciar Minecraft para evitar este riesgo de seguridad.
Este es un repositorio fantástico para encontrar modificaciones de rendimiento: https://github.com/NordicGamerFE/usefulmods
En lugar de Optifine, recomendaría alternativas más compatibles como Sodium + Iris o Rubidium + Oculus.
Recomiendo usar Java 17 o en su defecto Java 11 a menos que 8 sea absolutamente necesario. Pero si es así, estas banderas funcionarán con OpenJDK8, junto con Shenandoh GC (para Red Hat OpenJDK en clientes) o G1GC (para todo lo demás):
-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
Los usuarios de Java 8 x86 (también conocidos como la mayoría de los usuarios de Java 8) pueden agregar estos argumentos adicionales:
-XX:+UseXMMForArrayCopy
También puede obtener versiones Java 8 de GraalVM EE en la sección 21.X del sitio de Oracle y utilizar estos argumentos:
-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
Asegúrese de configurar -Dgraal.VectorizeSIMD
en false
si ejecuta sombreadores.
¡Ejecute sus servidores de Minecraft en Clear Linux! Es, con diferencia, la distribución de Linux más optimizada lista para usar y tiene algunas otras características interesantes (como un sistema de configuración sin estado). También ejecuta bastante bien clientes en GPU AMD/Intel: https://web.archive.org/web/20220916090057/https://docs.01.org/clearlinux/latest/tutorials/multi-boot/dual-boot- ganar.html
Oracle Linux también es una buena opción para servidores, ya que está razonablemente bien optimizado desde el primer momento y tiene Graalvm EE disponible a través del administrador de paquetes. Para los clientes, las distribuciones basadas en Arch como CachyOS o EndeavorOS son excelentes, ya que tienen un amplio soporte para la mayoría del hardware.
¡Asegúrate de que el cliente de Minecraft esté usando tu GPU discreta! Verifique la pestaña F3 y fuerce a Minecraft a usarlo en la " Configuración de gráficos de Windows ", no en el panel de control de AMD/Nvidia (ya que parece que ya no funcionan).
Los usuarios de Linux del cliente de Minecraft deben consultar https://github.com/Admicos/minecraft-wayland
¡Cierra todo lo que esté en segundo plano, incluido Discord, los lanzadores de juegos y tu navegador! Minecraft consume muchos recursos y no le gustan otras aplicaciones que generan interrupciones de la CPU o consumen E/S de disco, RAM, etc.
Java 18/19 tiene algunas incompatibilidades de modificaciones. Según se informa, funcionan con algunos paquetes de modificaciones, pero no estoy seguro de si hay algún beneficio en el rendimiento.
Los ajustes de Java mejoran el rendimiento del servidor y la tartamudez del cliente, pero no aumentan mucho el FPS promedio del cliente (si es que lo hacen). Para eso, ejecutar controladores de gráficos y modificaciones de rendimiento correctos/actualizados es mucho más importante: https://github.com/NordicGamerFE/usefulmods
Esta guía asume que tienes un poco de RAM libre cuando ejecutas Minecraft. Si su configuración tiene restricciones de RAM, intente eliminar los siguientes argumentos en particular: -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M
y pruebe el servidor Argumentos de G1GC.
De hecho, OpenJ9 de IBM ahorra RAM, como sugiere su reputación, pero en mis pruebas es más de un 30% más lento en la generación de servidores. Si hay alguna bandera que lo haga competitivo con OpenJDK, hágamelo saber en Discord o aquí: #9
-XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions
simplemente desbloquea más indicadores para usar. Estos se pueden enumerar con los indicadores -XX:+PrintFlagsFinal
y -XX:+JVMCIPrintProperties
; consulte Volcados de indicadores-XX:G1MixedGCCountTarget=3
: Esta es la cantidad de bloques de gc antiguos a los que apuntar en gc "mixto". Estas colecciones mixtas son mucho más lentas y el cliente de Minecraft no genera oldgen muy rápidamente, por lo que podemos reducir este valor a 3, 2 o incluso 1 para pausas de GC más cortas.-XX:+UseNUMA
habilita optimizaciones para sistemas multisocket, si corresponde. No estoy seguro si esto se aplica a CPU MCM como Ryzen o Epyc, pero se desactiva automáticamente si no corresponde.-XX:-DontCompileHugeMethods
Permite compilar métodos enormes. Minecraft modificado tiene algunos de estos, y no nos importa el mayor uso de CPU del compilador en segundo plano.-XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000
Habilita la optimización de métodos más grandes. Ver: https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8058148-XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M
reserva más espacio para el código compilado. Todas las secciones deben "sumarse" en ReservedCodeCacheSize
. He observado que Minecraft modificado alcanza el límite predeterminado de 250 megabytes con XX:+PrintCodeCache
, pero incluso si no está lleno, el tamaño más grande hace que la expulsión del código compilado sea menos agresiva.-XX:NmethodSweepActivity=1
(predeterminado 10) mantiene el código "frío" en la caché durante más tiempo. Tampoco hay riesgo de "llenar" el caché de código, ya que el código frío se elimina de manera más agresiva a medida que se llena.-XX:+UseStringDeduplication
-XX:+UseFastUnorderedTimeStamps
Evite llamadas al sistema para obtener la hora. El impacto de esto variará según el sistema, pero en realidad no nos preocupa la precisión de la marca de tiempo del registro.-XX:+UseCriticalJavaThreadPriority
Nada debería adelantarse a los subprocesos de Minecraft. Los subprocesos del GC y del compilador pueden esperar.-XX:ThreadPriorityPolicy=1
Utilice una gama más amplia de prioridades de subprocesos. Requiere sudo en Linux para funcionar. Algunos JDK (como Graal) habilitan esto de forma predeterminada, pero otros no.-XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150
: optimiza los subprocesos de recopilación concurrentes de G1GC, aún en prueba: https://research.spec.org/icpe_proceedings/2014/p111.pdf-XX:G1RSetUpdatingPauseTimePercent=0
: Queremos que todo este trabajo se realice en los subprocesos simultáneos de G1GC, no en las pausas.-XX:G1HeapWastePercent=18
No se moleste en recolectar de la generación anterior hasta que supere este porcentaje. Esto evita activar GC de generación joven "mixtos" más lentos, lo cual está bien ya que Minecraft (con suficiente memoria) no llena la generación anterior tan rápido. Idea de: https://www.reddit.com/r/Minecraft/comments/k9zb7m/tuning_jvm_gc_for_singleplayer/-XX:GCTimeRatio=99
Como objetivo, se debe dedicar el 1% del tiempo de CPU a la recolección de basura. El valor predeterminado es 12, que parece demasiado bajo. El valor predeterminado para Java 8 era 99.-XX:AllocatePrefetchStyle=3
Genera una instrucción de captación previa por línea de caché. La captación previa más agresiva suele ser útil en las CPU más nuevas con cachés grandes. Parece romper ZGC. Ver: https://github.com/openjdk/jdk/blob/bd90c4cfa63ba2de26f7482ed5d1704f9be9629f/src/hotspot/share/opto/macro.cpp#L1806-Dgraal.LoopRotation=true
Una optimización no predeterminada, probablemente será predeterminada pronto.-Dgraal.TuneInlinerExploration=1
Dedique más tiempo a tomar decisiones integradas. Para Minecraft, queremos que el compilador C2 sea lo más lento y agresivo posible.-Dgraal
están habilitados de forma predeterminada y están ahí como verificación de integridad, para depuración o como mecanismo de seguridad (si, por ejemplo, alguien, sin saberlo, deshabilita JVCMI con algún otro indicador).-XX:MaxInlineLevel=15 -XX:MaxVectorSize=32
) simplemente se copian de los valores predeterminados de Java 17. Otros (como +AggressiveOpts
) solo no son predeterminados en algunas compilaciones anteriores de Java 8.-Dgraal.BaseTargetSpending=160
(predeterminado 120) en Graal y algunas otras opciones en OpenJDK. Las CPU con cachés más grandes podrían beneficiarse de esto.-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
y graal.WriteableCodeCache=true
, que no parecen estables, pero pueden ser más estables en GraalVM 22.3.0G1HeapWastePercent
.-XX:+PrintFlagsFinal
y -XX:+JVMCIPrintProperties
para volcar las descripciones/valores predeterminados de los indicadores.