Considerando la siguiente línea de comando
java -Xms128m -Xms256m myapp.jar
¿Qué configuración se aplicará a la memoria mínima de JVM ( Xms
opción): 128 mo 256 m?
Considerando la siguiente línea de comando
java -Xms128m -Xms256m myapp.jar
¿Qué configuración se aplicará a la memoria mínima de JVM ( Xms
opción): 128 mo 256 m?
Respuestas:
Depende de la JVM, quizás de la versión ... quizás incluso de cuántos clips tiene en su escritorio en ese momento. Puede que ni siquiera funcione. No hagas eso.
Si está fuera de su control por alguna razón, compílelo y ejecútelo de la misma manera que ejecutaría su jar. Pero tenga cuidado, confiar en el orden de las opciones es una muy mala idea.
public class TotalMemory
{
public static void main(String[] args)
{
System.out.println("Total Memory: "+Runtime.getRuntime().totalMemory());
System.out.println("Free Memory: "+Runtime.getRuntime().freeMemory());
}
}
Como siempre, verifique la implementación específica de su JVM local, pero aquí hay una forma rápida de verificar desde la línea de comandos sin tener que codificar.
> java -version; java -Xmx1G -XX:+PrintFlagsFinal -Xmx2G 2>/dev/null | grep MaxHeapSize
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
uintx MaxHeapSize := 2147483648 {product}
Entonces, verá en este caso, la segunda instancia del argumento (2G) es lo que tiene prioridad (al menos en 1.8) y esa ha sido mi experiencia con la mayoría de las otras versiones modernas también.
java -Xmx1G -XX:+PrintFlagsFinal -Xmx2G 2>/dev/null | grep MaxHeapSize
, de esta manera es más fácil de deducir.
IBM JVM trata la instancia más a la derecha de un argumento como el ganador. No puedo hablar con HotSpot, etc.
Hacemos esto porque a menudo hay líneas de comando profundamente anidadas de archivos por lotes donde las personas solo pueden agregar al final y quieren que sea el ganador.
Apuesto a que es el segundo. Los argumentos generalmente se procesan en el orden:
for( int i=0; i<argc; i++ ) {
process_argument(argv[i]);
}
Pero si estuviera escribiendo un analizador de argumentos de Java, me quejaría de argumentos contradictorios.
¿Qué configuración se aplicará a la memoria mínima de JVM?
En las diversas versiones de Java que se enumeran a continuación, el "ganador" es el valor más a la derecha en la lista de argumentos. Como han señalado otros, no es una buena idea confiar en esto, pero tal vez sea información útil para compartir.
Java 1.8.0_172
~ $ java8
java version "1.8.0_172"
Java(TM) SE Runtime Environment (build 1.8.0_172-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.172-b11, mixed mode)
~ $ java -Xmx1024m -Xmx4024m -XX:+PrintFlagsFinal Test 2>/dev/null | grep MaxHeapSize
uintx MaxHeapSize := 4219469824 {product}
Java 11.0.3
~ $ java11
java version "11.0.3" 2019-04-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.3+12-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.3+12-LTS, mixed mode)
~ $ java -Xmx1024m -Xmx4024m -XX:+PrintFlagsFinal Test 2>/dev/null | grep MaxHeapSize
size_t MaxHeapSize = 4219469824 {product} {command line}
OpenJDK 12.0.1
~ $ java12
openjdk version "12.0.1" 2019-04-16
OpenJDK Runtime Environment (build 12.0.1+12)
OpenJDK 64-Bit Server VM (build 12.0.1+12, mixed mode, sharing)
~ $ java -Xmx1024m -Xmx4024m -XX:+PrintFlagsFinal Test 2>/dev/null | grep MaxHeapSize
size_t MaxHeapSize = 4219469824 {product} {command line}
AdoptOpenJDK 12.0.1
~ $ java12a
openjdk version "12.0.1" 2019-04-16
OpenJDK Runtime Environment AdoptOpenJDK (build 12.0.1+12)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 12.0.1+12, mixed mode, sharing)
~ $ java -Xmx1024m -Xmx4024m -XX:+PrintFlagsFinal Test 2>/dev/null | grep MaxHeapSize
size_t MaxHeapSize = 4219469824 {product} {command line}
OpenJDK 13-ea
~ $ java13
openjdk version "13-ea" 2019-09-17
OpenJDK Runtime Environment (build 13-ea+22)
OpenJDK 64-Bit Server VM (build 13-ea+22, mixed mode, sharing)
~ $ java -Xmx1024m -Xmx4024m -XX:+PrintFlagsFinal Test 2>/dev/null | grep MaxHeapSize
size_t MaxHeapSize = 4219469824 {product} {command line}