Дублированные параметры времени выполнения Java: каков порядок предпочтений? - PullRequest
66 голосов
/ 30 апреля 2010

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

java -Xms128m -Xms256m myapp.jar

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

Ответы [ 5 ]

51 голосов
/ 04 ноября 2014

Как всегда, проверьте конкретную реализацию вашей локальной 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), и это был мой опыт с большинством других современных версий.

37 голосов
/ 30 апреля 2010

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

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

33 голосов
/ 03 января 2014

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

27 голосов
/ 30 апреля 2010

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

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

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());
    }
}
9 голосов
/ 30 апреля 2010

Бьюсь об заклад, это второй. Аргументы обычно обрабатываются в следующем порядке:

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

Но если бы я писал анализатор аргументов Java, я бы пожаловался на противоречивые аргументы.

...