Какой-либо способ “перезагрузить” JVM?

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

31
задан rob199 25 February 2011 в 15:54
поделиться

6 ответов

Ваш лучший выбор состоит в том, чтобы, вероятно, выполнить интерпретатор Java в цикле и просто выйти. Например:

#!/bin/sh
while true
do
    java MainClass
done

, Если Вы хотите способность перезагрузить или завершить работу полностью, Вы могли бы протестировать статус выхода:

#!/bin/sh
STATUS=0
while [ $STATUS -eq 0 ]
do
    java MainClass
    STATUS=$?
done

В рамках программы Java, можно использовать System.exit (0), чтобы указать, что Вы хотите "перезагрузить", и System.exit (1), чтобы указать, что Вы хотите остановиться и остаться остановленными.

17
ответ дан 27 November 2019 в 22:47
поделиться

JVM IBM имеет функцию, названную "восстановленной", который позволяет Вам эффективно делать то, что Вы спрашиваете.

http://publib.boulder.ibm.com/infocenter/cicsts/v3r1/index.jsp?topic=/com.ibm.cics.ts31.doc/dfhpj/topics/dfhpje9.htm

Кроме JVM IBM, я не думаю, что это возможно.

7
ответ дан 27 November 2019 в 22:47
поделиться

Не реальная "перезагрузка", но:

можно создать собственный загрузчик класса и загрузить все классы (кроме начальной загрузки) с ним. Затем когда Вы хотите "перезагрузить", удостоверьтесь, что Вы делаете следующее:

  1. Конец любые потоки, что Вы открыли и используете свои классы.
  2. Располагают любое Окно / Диалоговое окно / Апплет, который Вы создали (приложение UI).
  3. Близкий / располагают любой другой корень GC / ресурсы ОС голодный ресурс, с которым взаимодействуют (соединения с базой данных, и т.д.).
  4. Выбрасывают Ваш специализированный загрузчик класса, создают другой экземпляр его и перезагружают все классы. Можно, вероятно, оптимизировать этот шаг путем предварительной обработки классов из файлов, таким образом, Вы не должны будете получать доступ к кодовой базе снова.
  5. Вызов Ваша основная точка входа.

Эта процедура используется (в некоторой степени) при "замене в горячем режиме" веб-приложений в веб-серверах.

Примечание, хотя, статические участники класса и JVM "глобальные" объекты (к которым получает доступ корень GC, который не находится под Вашим контролем) останутся. Например, Locale.setLocale () производит статического участника на Локали. Так как класс Локали загружается системным загрузчиком класса, он не будет "перезапущен". Это означает, что старый Объект языкового стандарта, который использовался в Locale.setLocale () будет доступен позже если не явно убранный.

еще один маршрут для взятия является инструментарием классов. Однако, так как я знаю мало его, я не решаюсь давать совет.

Объяснение о горячем развертываются с некоторыми примерами

2
ответ дан 27 November 2019 в 22:47
поделиться

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

Иначе, необходимо будет изучить коммерческие решения. Мятежник Java ( http://www.zeroturnaround.com/javarebel/ ) является одной такой опцией.

1
ответ дан 27 November 2019 в 22:47
поделиться

AFAIK там не является таким путем.

Уведомление, что, если бы был способ сделать это, оно высоко зависело бы от текущего загруженного кода для надлежащего высвобождения всех сохраненных средств для обеспечения корректного перезапуска (думают о файлах, socket/tcp/http/database соединения, потоки, и т.д.).

Некоторые приложения, как AS Jboss, получают Ctrl+C на консоли и обеспечивают корректное завершение работы, закрывая все ресурсы, но это - специализированный код и не функция JVM.

0
ответ дан 27 November 2019 в 22:47
поделиться

Я делаю что-то подобное использование JMX, я 'разгружу' модуль с помощью JMX и затем 'перезагружу' его. Негласно я уверен, что они используют другой загрузчик класса.

0
ответ дан 27 November 2019 в 22:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: