Изменить аргументы JVM изнутри JVM - PullRequest
3 голосов
/ 05 февраля 2009

Есть ли способ изменить аргументы jvm изнутри jvm? В частности, я хочу иметь возможность изменить максимальный размер кучи JVM изнутри. Возможно ли это?

Редактировать : Думаю, мне следует добавить причину, по которой я хотел это сделать. У меня есть несколько программ Java, которые работают на разных машинах / платформах. Эти программы имеют конфигурации, которые получены во время выполнения и различаются в зависимости от машины / среды, в которой работает программа. Некоторые из этих конфигураций могут быть изменены во время выполнения, и различные программы автоматически обновляются при изменении конфигурации.

Я хотел, чтобы размер кучи был одним из этих параметров конфигурации, источником которого является среда выполнения, как и остальная часть конфигурации. Если это так, то программа может запуститься (с некоторыми jvm-аргументами по умолчанию), а затем настроить себя на основе полученной конфигурации.

Ответы [ 7 ]

6 голосов
/ 05 февраля 2009

Это наполовину серьезная, совершенно нестандартная хакерская мысль:

... что если вы создали новый экземпляр java (с новыми настройками) из текущего jvm, а затем убили старый процесс из нового? Понятия не имею, поможет это или нет (или даже сработает) ...

3 голосов
/ 05 февраля 2009

Вы не можете изменить эти параметры просто потому, что это ставит под угрозу безопасность системы.

Если администратор желает разрешить определенной программе только определенные возможности, установив диспетчер безопасности, это может стать серьезной проблемой, если вы отключите его.

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

2 голосов
/ 10 февраля 2009

С JRockit вы можете по крайней мере предложить размер кучи.

JVMFactory.getJVM().getMemorySystem().suggestHeapSize(100*1000*1000);

См. JMAPI для получения дополнительной информации

2 голосов
/ 05 февраля 2009

В частности, я хочу иметь возможность изменить максимальный размер кучи JVM изнутри. Это возможно

номер

1 голос
/ 06 июня 2014

(Годы спустя), я нашел библиотеку, которая выполняет то, что мне было нужно во время публикации. Akuma - библиотека для демонизации процессов Java. Это позволяет перезапустить JVM с новыми аргументами.

Разница между использованием этого и запуском нового процесса с помощью начальной загрузки состоит в том, что stdin / stdout и другие файловые дескрипторы автоматически используются совместно.

0 голосов
/ 31 октября 2009

Динамическая настройка, например, -Xmx, была бы очень полезна для управления проектируемыми системными ресурсами (в первую очередь, занимаемыми площадями) для длительной работы. Конечно, одним из многих последствий являются большие / более длинные накладные расходы ГХ.

Я знаю несколько крупных серверных машин, на которых работают десятки и десятки JVM с кучей 1G +. Если бы у этих сред выполнения могли быть уменьшены их максимальные значения в периоды низкого использования, то вы могли бы значительно лучше управлять своими системными ресурсами.

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

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

Тем не менее, вы уверены, что это необходимо? Вы упоминаете "максимальный размер кучи". Если вы ссылаетесь на параметр -Xmx: это просто предел, который виртуальная машина никогда не может превышать. Это не означает, что виртуальная машина будет действительно использовать так много, она будет делать с меньшими затратами, если сможет.

Таким образом, вы всегда можете установить -Xmx на максимум, который может обработать система, и позволить JVM решить, сколько ей действительно нужно. Как вы думаете, почему вам нужно установить его динамически?

...