Компромисс скорости-Xms Java и-Xmx опций

Учитывая эти две команды

A:

$ java -Xms10G -Xmx10G myjavacode input.txt

B:

$ java -Xms5G -Xmx5G myjavacode input.txt

У меня есть два вопроса:

  1. Начиная с команды резервы больше памяти с ее параметрами, будет выполнение быстрее, чем B?
  2. Как делают -Xmx и -Xms влиять на рабочий процесс и вывод моей программы?
65
задан skaffman 6 November 2010 в 18:16
поделиться

4 ответа

Это зависит от GC, который использует ваша java. Параллельные сборщики мусора могут работать лучше с большими настройками памяти - хотя я в этом не разбираюсь.

В общем, если у вас большая память, тем реже сборку мусора нужно производить - остается много места для мусора. Однако, когда дело доходит до GC, GC должен работать с большим объемом памяти, что, в свою очередь, может быть медленнее.

22
ответ дан 24 November 2019 в 15:11
поделиться

The -Xmx argument defines the max memory size that the heap can reach for the JVM. You must know your program well and see how it performs under load and set this parameter accordingly. A low value can cause OutOfMemoryExceptions or a very poor performance if your program's heap memory is reaching the maximum heap size. If your program is running in dedicated server you can set this parameter higher because it wont affect other programs.

The -Xms argument sets the initial heap memory size for the JVM. This means that when you start your program the JVM will allocate this amount of memory instantly. This is useful if your program will consume a large amount of heap memory right from the start. This avoids the JVM to be constantly increasing the heap and can gain some performance there. If you don't know if this parameter is going to help you, don't use it.

In summary, this is a compromise that you have to decide based only in the memory behavior of your program.

165
ответ дан 24 November 2019 в 15:11
поделиться
  1. Распределение всегда зависит от вашей ОС. Если вы выделяете слишком много памяти, вы можете в конечном итоге загружать части в swap, что действительно происходит медленно.
  2. Будет ли ваша программа работать медленнее или быстрее, зависит от ссылок, которые виртуальная машина должна обрабатывать и очищать. Сборщику мусора не нужно просматривать выделенную память, чтобы найти брошенные объекты. Он знает свои объекты и объем памяти, который они выделяют с помощью сопоставления ссылок. Так что подметание зависит только от размера ваших объектов. Если ваша программа ведет себя одинаково в обоих случаях, единственное влияние на производительность должно быть при запуске виртуальной машины, когда виртуальная машина пытается выделить память, предоставляемую вашей ОС, и если вы используете подкачку (что снова приводит к 1.)
3
ответ дан 24 November 2019 в 15:11
поделиться

Трудно сказать, как распределение памяти повлияет на вашу скорость. Это зависит от алгоритма сборки мусора, который использует JVM. Например, если вашему сборщику мусора нужно приостановить работу, чтобы выполнить полную сборку, тогда, если у вас на 10 больше памяти, чем вам действительно нужно, то у сборщика будет еще 10 мусора для очистки.

Если вы используете java 6, вы можете использовать jconsole (в каталоге bin jdk), чтобы подключиться к вашему процессу и посмотреть, как ведет себя сборщик. В целом сборщики очень умны, и вам не нужно ничего настраивать, но если у вас есть необходимость, вы можете использовать множество опций для дальнейшей настройки процесса сбора.

2
ответ дан 24 November 2019 в 15:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: