Параметры кучи JVM
после прочтения уже задавал вопрос на эту тему и много погуглив я до сих пор не в состоянии иметь четкое представление о - Xms опции
мой вопрос: в чем разница между java -Xms=512m -Xmx=512m
и java -Xms=64m -Xmx=512m
?
на данный момент у меня есть следующий ответ:
единственное различие заключается в количестве сборок мусора, которые будут выполняться во время запуска моего приложения, и количестве выделений памяти. Я прав ?
здесь являются ли мои причины для этого ответа:
задание до 512m
не приводит к тому, что мое приложение использует действительно 512M
физической памяти после запуска. Я думаю, это связано с современным управлением виртуальной памятью ОС и выделением ленивых страниц. (Я заметил, что установка -Xms
до 512M
или 64M
не изменяет вообще начальную используемую память, сообщенную либо top на Linux, либо диспетчером задач на windows)
может кто-нибудь помочь мне понять влияние этого Xms
вариант или указать мне ссылки, которые помогут мне понять это?
спасибо заранее
Ману
6 ответов:
обобщить информацию, найденную после ссылки: JVM выделяет сумму, указанную-Xms, но ОС обычно не выделяет реальные страницы, пока они не понадобятся. Таким образом, JVM выделяет виртуальную память, как указано Xms, но только выделяет физическую память по мере необходимости.
вы можете увидеть это с помощью Process Explorer by Sysinternals вместо диспетчера задач в windows.
таким образом, существует реальная разница между использованием-Xms64M и-Xms512M. Но я думаю, что самое важное отличие - это то, что вы уже указали: сборщик мусора будет работать чаще, если вам действительно нужен 512MB, но только начал с 64MB.
JVM будет начинаться с использования памяти на начальном уровне кучи. Если maxheap выше, он будет расти до размера maxheap, поскольку требования к памяти превышают его текущую память.
и
- -Xms512m -Xmx512m
JVM начинается с 512 м, никогда не изменяет размер.
- -Xms64m -Xmx512m
JVM начинается с 64M, растет (до максимального потолка 512), если mem. требования превышает 64.
кроме стандартных параметров кучи
-Xms
и-Xmx
это также хорошо знать-XX:PermSize
и-XX:MaxPermSize
, который используется для указания размера Пермского генного пространства, потому что, хотя у вас может быть пространство в другом поколении в куче, вы можете запустить память, если ваше пермское генное пространство заполнится. Эта ссылка также имеет хороший обзор некоторых важные параметры JVM.
в JVM размер кучи адаптивно, то есть он будет пытаться найти лучший размер кучи для вашего приложения. -Xms и-Xmx просто определяет диапазон, в котором JVM может работать и изменять размер кучи. Если -Xms и-Xmx имеют одинаковое значение, то размер кучи JVM останется постоянным при этом значении.
обычно лучше всего просто установить -Xmx и позволить JVM найти лучший размер кучи, если нет конкретной причины, по которой вам нужно дать JVM большую кучу в JVM запуск.
Что касается того, когда JVM фактически запрашивает память из ОС, я считаю, что это зависит от платформы и реализации JVM. Я предполагаю, что он не будет запрашивать память, пока ваше приложение действительно не нуждается в ней. - Xmx и-Xms просто резервирует память.
Если ты написал: -Xms512m -Xmx512m когда он запускается, java выделяет в тот момент 512m ОЗУ для своего процесса и не может увеличить.
-Xms64m -Xmx512m когда он запускается, java выделяет только 64m ОЗУ для своего процесса, но java может увеличить его занятие памяти в то время как 512m.
Я думаю, что вторая вещь лучше, потому что вы даете 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
версия. Я уверен, что короткие паузы сборки мусора, и длинными выделений.