Параметры кучи JVM
После прочтения уже заданного вопроса по этому вопросу и большого количества поисковых запросов, я все еще не могу получить четкое представление о опции -Xms
Мой вопрос: в чем разница между java -Xms=512m -Xmx=512m
и java -Xms=64m -Xmx=512m
?
На данный момент у меня есть следующий ответ:
- Поощрять JVM к GC, а не вырастить кучу?
- Ошибка переполнения стека Java - как увеличить размер стека в Eclipse?
- Отладка java-приложения без запуска JVM с аргументами отладки
- CMSPermGenSweepingEnabled vs CMSClassUnloadingEnabled
- увеличить размер кучи java навсегда?
Единственное различие заключается в количестве сборок мусора, которые будут выполняться во время запуска моего приложения и количества распределений памяти. Я прав ?
Вот мои причины для этого ответа:
Установка параметра -Xms
на 512m
не приводит к тому, что мое приложение использует действительно -Xms
512m
физической памяти после запуска. Я полагаю, это связано с современным управлением виртуальной памятью операционной системы и распределением ленивых страниц. (Я заметил, что установка -Xms
до 512M
или до 64M
не изменяет вообще исходную используемую память, указанную либо сверху в Linux, либо диспетчером задач на windowsх)
Может ли кто-нибудь помочь мне понять влияние этого варианта Xms
или указать мне ссылки, которые помогут мне понять это?
заранее спасибо
Manu
- Запуск java с переменной JAVA_OPTS env
- Счетчик исключений Java для JVM HotSpot
- «Ошибка при инициализации VM; Не удалось зарезервировать достаточно места для кучи объектов ", используя -Xmx3G
- Что на самом деле делает флаг JVM CMSClassUnloadingEnabled?
- Разница между _JAVA_OPTIONS JAVA_TOOL_OPTIONS и JAVA_OPTS
- Как получить аргументы vm из java-приложения?
- Как установить -Dorg.apache.el.parser.COERCE_TO_ZERO = false программно
- Увеличение максимального размера кучи JVM для приложений с интенсивной памятью
Суммировать информацию, найденную после ссылки: 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
есть заметные паузы. Я уверен, что короткие паузы - это сборки мусора, а длинные - распределения кучи.