Начальный объем памяти для запуска приложения Spring Boot

Есть ли начальный объем памяти, который я должен установить для запуска приложения Spring Boot?

Например, чтобы запустить встроенное приложение Tomcat/Undertow, мы можем установить типичный объем памяти для опций -Xms и -Xmx java.

Как я могу узнать, какие значения мне нужно установить для запуска моего приложения?


person Carlos Alberto    schedule 12.02.2016    source источник
comment
ты получил решение? У меня есть вопрос, похожий на ваш   -  person Krish    schedule 15.05.2018
comment
Да, используйте JMC, чтобы проверить, как ведет себя ваше приложение.   -  person Carlos Alberto    schedule 15.05.2018


Ответы (3)


Вы должны запустить JavaMissionControl или другой Profiler, чтобы увидеть ваши фактические требования к памяти. Вы можете запустить JavaMissionControl на сервере, где установлена ​​Java (и в пути), запустив «jmc» из командной строки, а затем подключившись к вашей локальной JVM. Вы также можете подключиться к удаленной JVM. Для получения дополнительной информации перейдите по этой ссылке: http://www.oracle.com/technetwork/java/javaseproducts/mission-control/index.html

Обычно я устанавливаю максимальный объем памяти выше необходимого, максимум = 1 ГБ кажется хорошей отправной точкой. Вы захотите посмотреть профиль памяти вашего приложения в течение периода типичной активности. Имейте в виду, что когда вы устанавливаете начальный размер кучи 64 МБ, сборщик мусора запускает схему, которая не запускает основную сборку мусора до тех пор, пока это не потребуется по соображениям производительности (сборка мусора требует больших затрат). В результате вы увидите, как объем памяти со временем увеличивается примерно до 80% от размера кучи (этот процент можно регулировать). Как только пороговое значение будет достигнуто, запустится сборка мусора, и вы увидите, что используемая память JVM снова упадет до очень низкого уровня.

Обычно я ищу уровень памяти, который постоянно используется после серии крупных сборок мусора. Итак, скажем, после запуска вашего приложения вы видите, что использование твердотельной памяти после крупной сборки мусора постоянно падает примерно до 40 МБ. Поэтому я обычно устанавливаю минимальный размер JVM примерно на эту сумму, поскольку я знаю, что мне всегда нужно как минимум столько же.

Теперь вы знаете достойную отправную точку для ваших минимальных требований, так какой же максимальный объем памяти потребуется? Ну, это требует немного больше профилирования и проб и ошибок. Что я делаю, так это начинаю уменьшать максимальную настройку памяти и профилировать на некоторое время. То, что вы ищете, - это частота основных сборок мусора и загрузка ЦП JVM, достигающая стабильно высоких значений.

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

Это очень простой способ найти разумные значения для минимальных/максимальных настроек памяти, и он очень хорошо работает для меня в большинстве распространенных сценариев приложений. Конечно, есть много других более исчерпывающих способов профилирования вашего приложения для точной настройки как параметров памяти, так и схем/настроек сборки мусора, если вы действительно хотите точно настроить свои требования.

person pczeus    schedule 12.02.2016
comment
Если я не устанавливаю -Xms и Xmx, приложение получает кучу Java Solaris по умолчанию с InitialHeapSize:=67108864 (64 МБ) и MaxHeapSize:=1073741824 (1 ГБ). С помощью команды prstat -a показывает, что приложение использует почти все (774 Мб). При этом если я ставлю -Xms128m -Xmx128m приложение тоже работает нормально, вот и мой вопрос как узнать нужное количество памяти для него? Потому что ничего не устанавливая, java работает, используя гораздо больше, чем нужно - person Carlos Alberto; 13.02.2016
comment
Я считаю, что это то, что я описываю в своем ответе... как определить правильные значения для Xms и Xmx. - person pczeus; 13.02.2016
comment
Но есть ли причина, почему Java использует почти весь доступный maxheap (1 ГБ), если Xmx не установлен, и в то же время, если установлено 128 МБ, приложение также работает нормально? - person Carlos Alberto; 13.02.2016

Максимальный объем памяти, который вам нужен, почти полностью зависит от вашего приложения и нагрузки, с которой оно должно справляться. Использование такого инструмента, как JMeter, для имитации некоторой нагрузки — это один из способов узнать, сколько памяти требуется.

Минимальный объем памяти также зависит от вашего приложения, но вам потребуется не менее 25 МБ или около того. Эта запись в блоге содержит много дополнительной информации.

person Andy Wilkinson    schedule 12.02.2016
comment
Если я не устанавливаю -Xms и Xmx, приложение получает кучу Java Solaris по умолчанию с InitialHeapSize:=67108864 (64 МБ) и MaxHeapSize:=1073741824 (1 ГБ). С помощью команды prstat -a показывает, что приложение использует почти все (774 Мб). При этом если я ставлю -Xms128m -Xmx128m приложение тоже работает нормально, вот и мой вопрос как узнать нужное количество памяти для него? Потому что ничего не устанавливая, java работает, используя гораздо больше, чем нужно. - person Carlos Alberto; 12.02.2016

Обычно я запускаю банку без каких-либо флагов и начинаю мониторинг с помощью «Java VisualVM». Основываясь на реальных данных, я устанавливаю -Xmx. Как это.

person DoctorP    schedule 30.04.2017