Дубльовані параметри виконання Java: який порядок переваг?


82

Розглядаючи наступний командний рядок

java -Xms128m -Xms256m myapp.jar

Які налаштування застосовуватимуться до мінімальної пам'яті JVM ( Xmsопція): 128 м або 256 м?


17
Про жодну друкарську помилку не йдеться. Параметри Xms використовуються двічі спеціально. У цьому полягає суть питання
fabien7474,

Відповіді:


28

Залежить від 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());
    }
}

2
+1 - краще порахувати ті скріпки :-). Серйозно кажучи, це не ракетна наука змінювати те, що передає ці неоднозначні аргументи.
Stephen C

4
намагався використовувати різну кількість скріпок. не можу знайти перемикач на перший
OganM

65

Як завжди, перевірте конкретну реалізацію вашої локальної 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), і такий досвід я мав і в більшості інших сучасних версій.


8
java -Xmx1G -XX:+PrintFlagsFinal -Xmx2G 2>/dev/null | grep MaxHeapSize, таким чином легше вивести.
ryenus

40

IBM JVM розглядає крайній правий екземпляр аргументу як переможця. Я не можу розмовляти з HotSpot тощо.

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


21
+1 за те, що фактично відповів на запитання, а не понтифікував.
JimN


37

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


14
+1 за те, що фактично відповів на запитання, а не понтифікував.
JimN

1
як і CSS, пізніші перемоги
ryenus

9

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

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

Але якби я писав синтаксичний аналізатор Java, я б скаржився на суперечливі аргументи.


8

Які налаштування застосовуватимуться до JVM Minimum memory?

У різних версіях 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}

ПрийнятиOpenJDK 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-еа

~ $ 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}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.