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

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


person feiroox    schedule 18.04.2009    source источник
comment
Для справки, вот RFE для точки доступа: bugs.sun.com/bugdatabase/view_bug.do?bug_id=4408373   -  person Luke Quinane    schedule 21.05.2012


Ответы (7)


No.

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

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

person Michael Borgwardt    schedule 18.04.2009
comment
-XX: MaxHeapFreeRatio Значение по умолчанию - 70. Коэффициент свободного пространства - это объем пространства, не выделенного в куче, по сравнению с общим размером кучи. Если процент свободного места превышает значение по умолчанию, равное 70%, jvm уменьшит размер кучи, чтобы операционная система могла использовать память. - person 027; 11.05.2018
comment
Это возможно (и я делал это часто), но проблема в том, что использование памяти может сильно увеличиваться и уменьшаться. Он не пропорционален фактическому набору живых объектов, просто создание большого количества объектов в ряд может привести к взрыву кучи. Он выходит из строя только в том случае, если вы вручную вызываете сборщик мусора. Таким образом, вы в основном должны зарезервировать максимальный объем оперативной памяти. Нам действительно нужна возможность динамически изменять максимальный размер кучи. - person Stefan Reich; 15.06.2018

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

person thSoft    schedule 18.04.2009
comment
Также известна как сильная боль в спине. Если вы используете много памяти, последнее, что вам нужно, - это освободить ее все, а затем перезагрузить в другом процессе. Конечно, вы не можете держать старый процесс открытым достаточно долго для передачи данных, так как вы загружаете больше памяти двумя процессами только для выполнения передачи. Лучше надеяться, что вы правильно угадали сейчас, или вам придется повторить все заново. - person Basic; 21.06.2015

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

java -Xms32m -Xmx512m FooBar

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

person Andrew Hare    schedule 18.04.2009

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

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

person Jé Queue    schedule 29.10.2009
comment
Это скорее похоже на запрос функции JVM, чем на ответ. . . - person ruakh; 08.04.2015

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

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

person Peter Lawrey    schedule 25.01.2010
comment
Это предполагает, что вы заранее знаете, сколько памяти вам понадобится. Это нормально для веб-серверов / других потоковых вещей, но если вы анализируете данные (например, создаете индекс / ищите тенденции), вам нужно заранее знать, какими будут ваши данные, что довольно ограничивает - person Basic; 21.06.2015
comment
@Basic Вам не нужно знать, сколько памяти вам понадобится. -Xmx - это максимальное значение, которое может иметь JVM, т.е. программа должна аварийно завершить работу с ошибкой OutOfMemoryError, а не использовать больше памяти. Этот максимум обычно зависит от имеющегося у вас объема памяти и по умолчанию составляет 1/4 от основной памяти. JVM не будет использовать много памяти для программы hello world, независимо от того, что вы установили максимум. - person Peter Lawrey; 22.06.2015
comment
Предположим, у вас есть процесс, и вы заранее предоставили ему 50 гигабайт памяти, а во время работы заметите, что происходит много GC, и, вероятно, 56 гигабайт было бы лучше, и вы не можете легко перезапустить программу, не выполнив много повторных вычислений ... - person kap; 08.05.2017
comment
@kap, поэтому лучше установить максимум на уровень, на котором вы бы предпочли, чтобы программа завершилась ошибкой, чем продолжала работать. - person Peter Lawrey; 08.05.2017

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

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

person Sasha Firsov    schedule 25.01.2010

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

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

person bruno conde    schedule 18.04.2009
comment
Установите значение с умом ... Да, это хороший совет. Но рассмотрим этот случай - вы смотрите, как вы приближаете приложение к максимуму кучи, и ничего не можете с этим поделать. Да, в коде есть утечка ... но сначала нам нужно поддерживать активность в течение дня, а затем мы исправим проблему. - person alsor.net; 18.12.2009
comment
Также обратите внимание, что это может быть апплет или другой тип приложения, в котором вы не контролируете параметры запуска виртуальной машины. Это те случаи, когда это было бы хорошо. Я думаю, что основная проблема заключается в том, что если вы сможете это изменить, вы можете столкнуться с проблемами памяти, связанными с безопасностью. - person Alex Vaz; 21.02.2013