Estás configurando estas dos opciones:
-Xms14G -Xmx14G
Esto significa que la JVM debe comenzar con 14 GB (-Xms) y crecer hasta un máximo de 14 GB (-Xmx) amontonar Uso de la RAM. El uso real de RAM será mayor, ya que java necesita algo de espacio para sí mismo, para las clases cargadas, para las internas temporales de recolección de basura, etc. Lo que a su vez significa que la JVM asignará cerca de 16 GB desde el principio.
Ahora, en un sistema Linux, esto no físicamente asignar los 14 GB de heap justo al inicio - la JVM pide a Linux que asigne 14 GB, Linux le dice a la JVM "aquí tienes", pero esas páginas de ram sólo se asignarán a la JVM una vez que se escriban. Tomará desde varios segundos hasta 1-2 horas de tiempo de juego hasta que la JVM realmente escriba en toda la RAM, así que hasta ese punto, el SO tendrá al menos parte de la RAM para sí mismo. Una vez que los 14 GB estén llenos, Java iniciará su primera recolección de basura - por lo que liberará una gran cantidad de memoria internamente pero no devolverá esa memoria a tu sistema.
Lo que significa que tu Linux tiene muy poca caché de disco, lo que significa mucho más acceso al disco de lo necesario, lo que generalmente significa mucho retraso. (Esto podría ser algo mejor en un VPS donde el acceso al disco va a través del host que podría tener algo de caché en sí mismo).
Lo que realmente debes hacer es bajar tu -Xms
y -Xmx
a la mitad de la memoria RAM disponible, que en tu caso serían 8 GB. A continuación, comprueba cuánta RAM necesita realmente tu Minecraft, activando el registro de GC y comprobando los archivos de registro.
Para Java 14 (que debería utilizar junto con Paper), añada esto a su invocación java:
-Xlog:gc*:gc.log:time,level,tags:filecount=5,filesize=1024K
Esto generará un archivo llamado gc.log
en el directorio de su servidor (además, con el paso del tiempo, unas cuantas generaciones anteriores denominadas gc.log.0
y así sucesivamente. Esos archivos tienen información sobre cada ejecución de la GC, las líneas interesantes son las que se parecen a esto:
Pause Young (Normal) (G1 Evacuation Pause) 10247M->2108M(16384M) 9.477ms
En este caso, el parámetro -Xmx era 16G
Aquí es donde el 16484M
viene de. La recolección de basura comenzó a ejecutarse cuando se usaron 10247 MB, y terminó con 2108 MB después de la recolección de basura. Lo que significa que no se puede bajar de ~ 2 GB porque eso es lo que realmente necesita Java, y no debería bajar del doble de este valor. Todo lo que esté por encima de, en mi caso, 4 GB, es un lujo que puedes gastar si lo tienes, pero no te ayudará mucho, y de hecho puede ser perjudicial porque se come la caché del disco del sistema.
Así que:
- ajuste sus parámetros de memoria a 8 GB
- Activar el registro de la GC, jugar durante un día, y comprobar cuánta pila necesita realmente el servidor después de recogida de basuras
- asignar 2-3 veces este valor a -Xmx, y este valor a -Xms
- si necesitas mucho menos de los 2 GB de mi caso, todavía puedes subir hasta la mitad de la cantidad máxima de lo que tiene el VPS; 8 GB en tu caso
- si necesitas mucho más, por ejemplo, necesitas 8 GB después de recolección de basura (que sólo debería ocurrir si tiene una tonelada de plugins o varios que se comportan mal), aumente la RAM de su VPS a aproximadamente 3-4 veces el valor después de la recolección de basura, y siga estableciendo -Xmx a la mitad de su RAM disponible/el doble del valor necesario después de GC.
Si todavía está utilizando Java 8, las opciones de inicio cambian a
-verbose:gc -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=1M
y las entradas del archivo de registro se parecerán más a esto:
[Eden: 8176.0M(8176.0M)->0.0B(8176.0M) Survivors: 16.0M->16.0M Heap: 10.7G(16.0G)->2790.4M(16.0G)]
En este caso, es el Heap
valor que le interesa: aquí, 16 GB de -Xmx
10,7 GB utilizados antes de la GC, 2790 MB después de la GC.
3 votos
Como nota al margen, ¿de dónde has sacado estos ajustes? Es posible que estos ajustes sean para alguien con una configuración diferente y específica.
0 votos
Estuve mirando una pasta de /timings y me mostró que tenía banderas desactualizadas, así que copié los argumentos que habían puesto en ese post y retoqué algunos
1 votos
¿Qué tan rápido llega al 100%? La JVM es conocida por las fugas de memoria.
0 votos
Después de 5 minutos de estar en línea el servidor estará al 100%