Компромисс скорости Java-xms и-Xmx параметры


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

A:

$ java -Xms10G -Xmx10G myjavacode input.txt

B:

$ java -Xms5G -Xmx5G myjavacode input.txt

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

  1. поскольку команда A резервирует больше памяти со своими параметрами, будет ли a работать быстрее, чем B?
  2. как -Xmx и -Xms влияют на процесс и выход моей программы?
6 64

6 ответов:

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

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

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

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

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

Я обнаружил, что в некоторых случаях слишком много памяти может замедлить работу программы.

например, у меня был механизм преобразования на основе гибернации, который начал работать медленно по мере увеличения нагрузки. Оказалось, что каждый раз, когда мы получали объект из БД, hibernate проверял память на объекты, которые никогда не будут использоваться снова.

решение состояло в том, чтобы выселить старые объекты из сеанса.

Стюарт

  1. распределение всегда зависит от вашей ОС. Если вы выделяете слишком много памяти, вы можете в конечном итоге загрузить части в swap, что действительно медленно.
  2. работает ли ваша программа медленнее или быстрее, зависит от ссылок, которые должна обрабатывать и очищать виртуальная машина. GC не нужно прочесывать выделенную память, чтобы найти заброшенные объекты. Он знает, что это объекты и объем памяти, который они выделяют путем сопоставления ссылок. Настолько широкой, это зависит от размера вашего объекты. Если ваша программа ведет себя одинаково в обоих случаях, единственное влияние на производительность должно быть при запуске виртуальной машины, когда виртуальная машина пытается выделить память, предоставленную вашей ОС, и если вы используете своп (что снова приводит к 1.)

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

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

> C:\java -X

-Xmixed           mixed mode execution (default)
-Xint             interpreted mode execution only
-Xbootclasspath:<directories and zip/jar files separated by ;>
                  set search path for bootstrap classes and resources
-Xbootclasspath/a:<directories and zip/jar files separated by ;>
                  append to end of bootstrap class path
-Xbootclasspath/p:<directories and zip/jar files separated by ;>
                  prepend in front of bootstrap class path
-Xnoclassgc       disable class garbage collection
-Xincgc           enable incremental garbage collection
-Xloggc:<file>    log GC status to a file with time stamps
-Xbatch           disable background compilation
-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size
-Xss<size>        set java thread stack size
-Xprof            output cpu profiling data
-Xfuture          enable strictest checks, anticipating future default
-Xrs              reduce use of OS signals by Java/VM (see documentation)
-Xcheck:jni       perform additional checks for JNI functions
-Xshare:off       do not attempt to use shared class data
-Xshare:auto      use shared class data if possible (default)
-Xshare:on        require using shared class data, otherwise fail.

The -X параметры нестандартны и могут быть изменены без предварительного уведомления.

(копировать-вставить)