Установка размера кучи JVM во время выполнения - PullRequest
59 голосов
/ 18 апреля 2009

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

Ответы [ 7 ]

59 голосов
/ 18 апреля 2009

Нет.

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

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

13 голосов
/ 18 апреля 2009

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

7 голосов
/ 18 апреля 2009

Вы можете настроить эти параметры при запуске приложения, но после запуска JVM и запуска эти значения нельзя изменить. Примерно так:

java -Xms32m -Xmx512m FooBar

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

2 голосов
/ 25 января 2010

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

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

2 голосов
/ 30 октября 2009

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

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

0 голосов
/ 25 января 2010

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

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

0 голосов
/ 18 апреля 2009

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

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

...