Подтвердить что ты не робот

Дублированные варианты исполнения Java: какой порядок предпочтений?

Учитывая следующую командную строку

java -Xms128m -Xms256m myapp.jar

Какие настройки будут применены для JVM Минимальная память (опция Xms): 128 м или 256 м?

4b9b3361

Ответ 1

Зависит от JVM, возможно, от версии... возможно, даже от количества скрепки на вашем столе в то время. Это может даже не сработать. Не делайте этого.

Если он по какой-то причине не работает, скомпилируйте и запустите его так же, как вы запустите свою банку. Но будьте осторожны, полагаясь на порядок вариантов - это действительно плохая идея.

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());
    }
}

Ответ 2

Как всегда, проверьте локальную специфическую реализацию JVM, но вот быстрый способ проверить из командной строки без необходимости кода.

> 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}

Итак, в этом случае вы увидите, что второй экземпляр аргумента (2G) имеет приоритет (по крайней мере, в версии 1.8), и это был мой опыт работы с большинством других современных версий.

Ответ 3

IBM JVM рассматривает самый правый экземпляр аргумента в качестве победителя. Я не могу говорить с HotSpot и т.д.

Мы делаем это, так как часто вложенные командные строки из пакетных файлов, где люди могут добавлять только до конца, и хотят сделать это победителем.

Ответ 4

FTR, OpenJDK 1.7 также, по-видимому, имеет самое правое значение, по крайней мере, для -Xms.

Ответ 5

Я ставлю его вторым. Аргументы обычно обрабатываются в следующем порядке:

for( int i=0; i<argc; i++ ) {
  process_argument(argv[i]);
}

Но если бы я писал парсер java-аргументов, я бы жаловался на конфликтующие аргументы.

Ответ 6

  Какие настройки будут применяться для минимальной памяти JVM?

В различных версиях Java, перечисленных ниже, "победитель" является самым правым значением в списке аргументов. Как отмечали другие, не стоит полагаться на это, но, тем не менее, возможно, это полезная информация для обмена.

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}