Параметры кучи JVM

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

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

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

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

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

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

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

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

Manu

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

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

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

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

Так,

  • -Xms512m -Xmx512m

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

  • -Xms64m -Xmx512m

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

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

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

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

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

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

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

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

Я создал этот пример игрушки в 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 есть заметные паузы. Я уверен, что короткие паузы - это сборки мусора, а длинные - распределения кучи.

  • Как установить свойство Java-системы, чтобы оно было эффективным, когда я запускаю JVM без добавления его в аргументы командной строки
  • Каков максимальный размер кучи с 64-битной JVM?
  • Передача аргументов JVM Tomcat при работе в качестве службы?
  • Как отключить использование стека IPv6 для IPv4 IP на JRE?
  • Как увеличить лимит памяти IDE в IntelliJ IDEA на Mac?
  • Что делает -XX: MaxPermSize?
  • Давайте будем гением компьютера.