2009-07-08 8 views
59

После чтения уже задавала вопрос по этому вопросу и много прибегая к помощи я до сих пор не в состоянии иметь четкое представление о -Xms опционныхJVM параметры кучи

Мой вопрос: какая разница между java -Xms=512m -Xmx=512m и java -Xms=64m -Xmx=512m ?

На данный момент у меня есть следующий ответ:

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

Вот мои причины этого ответа:

Установка опции -Xms в 512m не приводит к моему приложению с помощью действительно 512M физической памяти после запуска. Я полагаю, это связано с современным управлением виртуальной памятью операционной системы и распределением ленивых страниц. (Я заметил, что установка -Xms к 512M или 64M не изменяется при всех начальной используемой памяти отчётной либо сверху на Linux или менеджер задач на окнах)

Может кто-то помочь мне понять влияние этого Xms или указать мне ссылки, которые помогут мне понять это?

Заранее спасибо

Ману

ответ

31

Чтобы суммировать информацию, найденную после ссылки: JVM выделяет сумму, указанную -Xms, но ОС обычно не выделяет реальные страницы, пока они не понадобятся. Таким образом, JVM выделяет виртуальную память, как указано Xms, но только выделяет физическую память по мере необходимости.

Вы можете увидеть это, используя Process Explorer от Sysinternals вместо диспетчера задач в окнах.

Таким образом, существует реальная разница между использованием -Xms64M и -Xms512M. Но я думаю, что самое важное отличие - это тот, который вы уже указали: сборщик мусора будет работать чаще, если вам действительно нужен 512 МБ, но только начался с 64 МБ.

+12

Я думаю, что настоящий синтаксис -Xms64m и не -Xms = 64m. Если я ошибаюсь, пожалуйста, откатитесь! – Burkhard

+1

Нашел это, исследуя некоторые тонкости jvm config. Принятый ответ здесь очень отличается от моего понимания этих ценностей. Да, большинство ОС будут только делать физические страницы доступными, когда сбой небольшой страницы, когда приложение пытается получить доступ к памяти, которую он имеет malloc'ed, - но Xms указывает начальный объем памяти, malloced на jvm, - который помещает верхнюю границу на количество страниц, которые могут быть назначены * без * приложения malloc'ing больше памяти - и в случае Java это будет только malloc больше памяти (до Xmx), если недостаточная память становится доступной gc – symcbean

+0

@symcbean Я смущен , Кажется, ваше понимание не сильно отличается от того, что находится в ответе. Вы просто используете разные слова, но описываете то же самое поведение. – Turismo

4

если вы писали: -Xms512m -Xmx512m , когда это началось, ява выделить в те моменты 512m барана для его процесса и приращения косяка.

-Xms64m -Xmx512m Когда он запускается, java выделяет только 64 м бара для своего процесса, но java может увеличивать свою память до 512 м.

Я думаю, что вторая вещь лучше, потому что вы даете java автоматическое управление памятью.

+0

Я знаю это. Но что именно означает «Java выделять в тот момент 512 м»? Эта память кажется неэффективно распределенной, так как моя система с 512 Мбайт может запускать несколько других приложений без обмена и перепроверить меня, что мое приложение Java использует только несколько мегабайт. –

+1

Почему это было приостановлено? Это технически правильно, за исключением последнего предложения, которое может быть или не быть правильным. В мире с высокой производительностью обычно разумнее иметь java, выделяя всю память, которая ему понадобится, с одним единственным brk(). В других ситуациях распределение памяти по мере ее использования может быть более разумным. – Fredrik

+0

Я сам не ответил на этот ответ. Что касается вашего комментария, у меня есть тот же вопрос, что и тот, который я попросил dan: Есть ли какой-либо «риск» или недостаток для установки значения Xms на то же значение, что и Xmx? Manu –

34

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

Так,

  • -Xms512m -Xmx512m

JVM начинается с 512 M, никогда не изменяет.

  • -Xms64m -Xmx512m

виртуальной машины Java начинается с 64M, растет (до максимального потолка 512), если MEM. требования превышают 64.

+0

Я знаю это. Но как сказано в моем предыдущем комментарии, что «Java начнет с использования памяти на начальном уровне кучи» точно означает?Эта память кажется неэффективной, так как моя 512-миллиметровая система может запускать несколько других приложений без обмена и перепроверить меня, что только мое мегабайт используется моим Java-приложением. –

+3

Обычно вы устанавливаете размер начальной кучи на большее значение, если знаете, что приложение при запуске будет потреблять определенный объем памяти. Это не позволяет JVM отнимать время выполнения при запуске, чтобы изменить размер кучи несколько раз. Это особое использование является очень распространенной оптимизацией, чтобы ускорить работу eclipse, избегая дорогостоящего цикла распределения. – dhable

+0

Спасибо за этот ответ, который приводит меня к этому другому вопросу: Есть ли какой-либо «риск» или недостаток для установки значения Xms на то же значение, что и Xmx? –

5

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

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

Насколько JVM действительно запрашивает память из ОС, я считаю, что это зависит от платформы и реализации JVM. Я предполагаю, что он не будет запрашивать память, пока ваше приложение действительно не понадобится. -Xmx и -Xms просто резервируют память.

14

Помимо стандартных параметров Heap -Xms и -Xmx это также хорошо знать -XX:PermSize и -XX:MaxPermSize, который используется для определения размера Пермь Gen пространства, потому что даже если вы могли бы иметь место в другом поколении в куче вы можете запустить из памяти, если ваше пространство perm gen заполняется. Эта ссылка также имеет хороший обзор некоторых important JVM parameters.

0

Я создал эту игрушку пример scala, my_file.scala:

object MyObject { 

    def main(args: Array[String]) { 
     var ab = ArrayBuffer.empty[Int] 

     for (i <- 0 to 100 * 1000 * 1000) { 
      ab += i 
      if (i % 10000 == 0) { 
       println("On : %s".format(i)) 
      } 
     } 
    } 
} 

Я побежал с:

scala -J-Xms500m -J-Xmx7g my_file.scala 

и

scala -J-Xms7g -J-Xmx7g my_file.scala 

Есть, конечно, заметные паузы в -Xms500m версии. Я уверен, что короткие паузы - это сборки мусора, а длинные - распределения кучи.

Смежные вопросы