Установка размера кучи 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
с умом. Если ваше приложение представляет собой какое-то серверное приложение, вы можете установить более высокое значение, иначе скомпрометируйте свой выбор с другими возможными приложениями, работающими на клиентских компьютерах, и, конечно, с доступной памятью.