Есть ли способ установить размер кучи из запущенной программы Java?
Установка размера кучи JVM во время выполнения
Ответы (7)
No.
Что вы можете сделать с приложением, которое имеет очень переменные требования к куче, так это установить очень высокий максимальный размер кучи с помощью -Xmx
и настроить -XX:MaxHeapFreeRatio
и -XX:MinHeapFreeRatio
, чтобы приложение не зависало от большого количества памяти, когда куча сжимается (оно делает это с настройками по умолчанию).
Но обратите внимание, что это может вызвать проблемы с производительностью, когда память, фактически используемая приложением, изменяется как сильно, так и быстро - в этом случае вам лучше, чтобы она висела на всей памяти, а не возвращала ее ОС только для того, чтобы потребовать ее. снова через секунду. Вы также можете поиграть с параметрами GC, чтобы убедиться, что GC не оставляет слишком много невостребованных объектов, что он имеет тенденцию делать, когда есть много места для роста кучи, и что нарушит цель, заключающуюся в том, чтобы размер кучи соответствовал потребностям приложения.
Согласно http://www.dreamincode.net/forums/showtopic96263.htm, вы не может этого сделать во время выполнения, но вы можете создать другой процесс с другим размером кучи.
Вы можете настроить эти параметры при запуске приложения, но после того, как JVM запущена и работает, эти значения не могут быть изменены. Что-то вроде этого:
java -Xms32m -Xmx512m FooBar
установит минимальный размер кучи на 32 МБ и максимальный размер кучи на 512 МБ. После того, как они установлены, вы не можете изменить их в работающей программе.
Возможно, действительно существует консенсус, что это невозможно, но мы должны посмотреть на исходный код JVM, чтобы увидеть, как им можно эргономично управлять. Было бы очень хорошо, если бы агент JVMTI мог настраивать размер кучи / perm / tenured / new / & c онлайн / во время выполнения.
Что бы это сделало? это позволит агентам делать выводы о корректировках размеров на основе целей производительности или занимаемой площади, что будет важно при перемещении JVM в облако.
Вы можете использовать параметр -mx при запуске (также известный как -Xmx). Это максимальный размер, который вам может когда-либо понадобиться, поэтому вам не нужно устанавливать его на больше, чем максимальный размер, который вам когда-либо понадобится.
Однако можно обойтись без проверки main () максимального размера и перезапуска java, если максимальный размер не соответствует желаемому. т.е. запустить другую Java-программу и умереть.
Я задал себе тот же вопрос. И, в отличие от ответов выше, я могу кое-что сделать с моим приложением, увеличивающим максимальный размер кучи JVM. Если приложение является веб-сервером в режиме кластера, я мог бы запустить новый экземпляр с измененным минимальным / максимальным размером кучи, а затем выключить начальный экземпляр. Это должно быть особенно просто в GlassFish, где у вас есть экземпляр управления, отделенный от JVM nodeAgent (кластерный экземпляр сервера приложений).
Поскольку многие приложения JVM являются веб-приложениями, я думаю, что стоит сохранить их в этом блоге.
Если я правильно понял ваш вопрос, вы пытаетесь изменить размер кучи во время выполнения. Я не вижу причин, почему это должно быть возможно. Установите размер кучи при запуске с помощью параметра -Xmx
JVM. Я также советую устанавливать параметр -Xms
только в случае крайней необходимости. Эта опция устанавливает начальный объем головной памяти, выделяемой для JVM.
Вы должны знать, как ваше приложение ведет себя с точки зрения памяти. Установите значение -Xmx
с умом. Если ваше приложение представляет собой своего рода серверное приложение, вы можете установить более высокое значение, в противном случае поставьте под угрозу свой выбор другими возможными приложениями, работающими на клиентских машинах, и, конечно же, доступной памятью.