2009-02-05 6 views
3

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

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

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

ответ

2

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

No.

6

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

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

+1

Вам не нужно убивать родителя от ребенка, родитель может убить себя, как только ребенок будет запущен. – paxdiablo

+0

Учитывая это требование, это не является необоснованным решением. В основном напишите загрузочное приложение, которое читает конфигурацию и запускает «реальное» приложение. –

+0

@Pax: Еще лучше, хороший звонок :) – javamonkey79

3

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

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

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

2

С JRockit вы можете указать хотя бы кучу размера.

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

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

+0

Согласно моему чтению Javadoc, это не позволяет сделать размер кучи больше максимального размера кучи (-mx). Кроме того, он не будет работать для Sun JVM. –

0

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

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

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

0

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

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

1

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

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

Смежные вопросы