Сбрасывание Java-программы в файл и ее перезапуск

Мне просто интересно, можно ли выгрузить запущенную программу Java в файл, а затем перезапустить ее (та же машина)

Звучит немного странно, но кто знает

--- обновить -------

Да, это функция спящего режима для процесса, а не полная система. Но google "hibernate jvm process", и вы поймете мою боль.

Возникает вопрос для Linux по этой теме (здесь). Быстро, можно спящий процесс (далеко не 100% надежный) с CryoPID.

Аналогичный вопрос был поднят в qaru.site/info/296978/... несколько лет назад.

С JVM я получил обоснованное предположение, что спящий режим должен быть намного проще, не всегда возможен и не надежен на 100% (например, пользовательский интерфейс и файлы).


Сериализация постоянного состояния приложения является опцией, но это не ответ на вопрос.

Ответы

Ответ 1

Это может меня немного перехитрить, но одна вещь, которую вы можете сделать, это запустить что-то вроде VirtualBox и остановить/сохранить машину.

Существует также:
 - JavaFlow от Apache, который должен делать именно это, хотя я лично не пробовал это.
 - Brakes, который может быть именно тем, что вы ищете

Ответ 2

Я верю, что спрашивает OP то, что ребята Smalltalk делали на протяжении десятилетий, - сохраняйте всю среду программирования/выполнения в файле изображения и работайте над ней.

AFAIK не существует способа сделать то же самое в Java.

Ответ 3

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

Нашел презентацию/демо, о которой я думал, именно на OOPSLA 2005 они говорили о squawk

Удачи!

Другие интересные ссылки: Merpati

Aglets

M-JavaMPI

Ответ 4

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

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

Состояние программы может быть удивительно малым по сравнению с используемым размером памяти.

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

Надеюсь, что это поможет - даже если это будет сложнее, чем вы могли надеяться.

Ответ 5

Как насчет использования SpringBatch framework?

Насколько я понял из вашего вопроса, вам нужна какая-то надежная и возобновляемая java-задача, если это так, я считаю, что Spring Batch будет делать магию, потому что вы можете разделить свою задачу (работу) на несколько шагов, пока каждый шаг (а также всю работу) имеет свой собственный контекст выполнения, который сохраняется в хранилище, с которым вы решили работать.

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

Вы также можете приостановить и перезапустить свою работу программно, если задание было настроено как перезагружаемое, а ExecutionContext для этого задания уже существует.

Удачи!

Ответ 6

Я считаю: 1- единственный общий способ - реализовать сериализацию. 2 - хороший способ восстановить работоспособную систему - это виртуализация ОС 3- теперь вы спрашиваете что-то вроде одиночной сериализации процесса.

Проблема заключается в IO.  Говорит, что ваш процесс использует временный файл, который удаляется системой после   "hybernation", но ваша программа этого не знает. У вас будет исключение IOException  где-то.

Итак, слово, если программа не предназначена для случайного прерывания, не будет работать.  Это рискованное и неповторимое решение, поэтому я считаю, что только 1,2 имеют смысл.

Ответ 7

Я думаю, что IDE поддерживает такую ​​отладку. Это не невозможно, хотя я не знаю, как это сделать. Может быть, вы получите подробную информацию, если вы обратитесь к какому-то затмению или небанковскому вкладчику.

Ответ 8

Сначала вам нужно разработать приложение, чтобы использовать Memento pattern или любой другой шаблон, который позволяет сохранить состояние вашего приложения. Также может быть и шаблон наблюдателя. После того, как ваш код структурирован таким образом, что сохранение состояния возможно, вы можете использовать сериализацию Java, чтобы фактически выписать все объекты и т.д. В файл, а не помещать его в базу данных.

Всего на 2 цента.

Ответ 9

То, что вы хотите, невозможно из самой природы компьютерной архитектуры.

Каждая программа Java скомпилируется в промежуточный код Java, а затем этот код интерпретируется в код собственной платформы (при запуске). Нативный код сильно отличается от того, что вы видите в файлах Java, потому что это зависит от подчеркивания платформы и версии JVM. Каждая платформа имеет разные наборы команд, управление памятью, систему драйверов и т.д. Итак, представьте, что вы спятили вашу программу на Windows, а затем запустили ее на Linux, Mac или на любом другом устройстве с JRE, например, на мобильном телефоне, автомобиле, кард-ридере, и т.д. Все ад будет ломаться.

Вы решили сериализовать каждый важный объект в файлы, а затем закрыть программу изящно. Когда "unhibernating", десериализуйте эти экземпляры из этих файлов, и ваша программа может продолжить работу. Количество "важных" экземпляров может быть довольно небольшим, вам нужно только сохранить "бизнес-данные", все остальное можно восстановить из этих данных. Вы можете использовать Hibernate или любую другую структуру ORM для автоматизации этой сериализации поверх базы данных SQL.

Ответ 10

Вероятно, Терракота может это сделать: http://www.terracotta.org

Я не уверен, но они поддерживают сбои сервера. Если все серверы останавливаются, процесс должен сохраняться на диск и ждать, я думаю.

В противном случае вы должны реорганизовать ваше приложение для сохранения состояния явно. Например, если вы реализуете что-то вроде runnable и делаете его Serializable, вы сможете его сохранить.