Установка размера кучи JVM во время выполнения

Есть ли способ установить размер кучи из работающей Java-программы?

8 ответов

Решение

Нет.

Что вы можете сделать с приложением, которое имеет очень изменяющиеся требования к куче, так это установить максимальный размер кучи с помощью -Xmx и настроить -XX:MaxHeapFreeRatio а также -XX:MinHeapFreeRatio так что приложение не будет зависать от большого количества памяти при уменьшении кучи (оно делает это с настройками по умолчанию).

Но обратите внимание, что это может вызвать проблемы с производительностью, когда память, фактически используемая приложением, сильно и быстро меняется - в этом случае лучше оставить его на всю память, а не возвращать ее ОС только для того, чтобы потребовать ее. снова секунду спустя. Возможно, вы также захотите поработать с опциями GC, чтобы убедиться, что GC не оставляет вокруг себя слишком много невостребованных объектов, что обычно происходит, когда есть много места для роста кучи, и что может нанести ущерб цели: желая размер кучи, чтобы приспособиться к потребностям приложения.

Согласно http://www.dreamincode.net/forums/showtopic96263.htm, вы не можете сделать это во время выполнения, но вы можете порождать другой процесс с другим размером кучи.

Вы можете настроить эти параметры при запуске приложения, но после запуска JVM эти значения не могут быть изменены. Что-то вроде этого:

java -Xms32m -Xmx512m FooBar

установит минимальный размер кучи 32 МБ, а максимальный размер кучи 512 МБ. Как только они установлены, вы не можете изменить их в работающей программе.

Вы можете использовать опцию -mx при запуске (также известную как -Xmx). Это максимальный размер, который вам может понадобиться, поэтому вам не нужно устанавливать его больше, чем максимальный размер, который вам когда-либо понадобится.

Тем не менее, обходной путь заключается в том, чтобы main() проверил максимальный размер и перезапустил Java, если максимальный размер не соответствует желаемому. т.е. запустить другую программу Java и умереть.

Консенсус может действительно заключаться в том, что это невозможно, но мы должны посмотреть на источник JVM, чтобы увидеть, как им можно управлять эргономично. Было бы очень хорошо иметь возможность, чтобы агент JVMTI мог регулировать размер кучи /perm/tenured/new/&c в режиме онлайн / во время выполнения.

Что бы это сделать? это позволило бы агентам определять корректировки размеров на основе целей производительности или занимаемой площади, которые будут важны при перемещении JVM в облако.

Я задал себе тот же вопрос. И в отличие от ответов выше, я могу кое-что сделать с моим приложением, увеличив максимальный размер JVM кучи. Если приложение является веб-сервером в режиме кластера, я мог бы запустить новый экземпляр с измененным размером кучи мин / макс и затем отключить начальный экземпляр. Это должно быть особенно просто в GlassFish, где у вас есть экземпляр управления, отделенный от JVM nodeAgent (кластерный экземпляр сервера приложений).

Поскольку многие приложения JVM являются веб-приложениями, я думаю, что стоит сохранить в этом блоге.

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

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

java -Xmx500m только при запуске

Другие вопросы по тегам