Подтвердить что ты не робот

Существуют ли какие-либо виртуальные машины Java, которые могут сохранять свое состояние в файле, а затем перезагрузить это состояние?

Существуют ли какие-либо виртуальные машины Java, которые могут сохранить свое состояние в файле, а затем перезагрузить это состояние?

Если да, то какие?

4b9b3361

Ответ 1

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

Я использую VMWare Player для тестирования IE на работе, и это работает, как указано выше, когда я закрываю и позже открываю его. Обычно я это делаю, когда приложения ничего не замечают в виртуальной машине, но пока они не получают доступа к каким-либо внешним ресурсам (например, сетевым сокетам), я ожидаю, что он будет работать так, как если бы VM никогда не закрывалась.

Ответ 2

Вы должны сериализовать релевантные объекты, специфичные для домена, которые могут быть де-сериализованы другой версией JVM.

Я не знаю никаких инструментов, сохраняющих всю JVM. Самое близкое, что я сделал, это создание дампа ядра из работающего JVM-процесса с использованием gcore, затем используя jsadebugd, jmap или jstack, чтобы отладить его.

Например:

$ jps # get JVM process ID XXX
$ gcore -o core XXX
$ jsadebugd $JAVA_HOME/bin/java core.XXX

UPDATE

Я не думаю, что вы еще собираетесь найти решение, которое переносится между архитектурами.

Ответ 3

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

Ответ 4

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

Это можно использовать для кластеризации приложений и/или для сохранения состояния кучи. Фактически, вы можете использовать его, чтобы запустить JVM вверх и забрать, где вы остановились. Для получения дополнительной информации проверьте: http://www.infoq.com/articles/open-terracotta-intro

Надеюсь, что это поможет.

Ответ 5

Продолжение, вероятно, будет тем, что вы ищете:

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

Для Java существует как минимум две библиотеки продолжения: продолжения RIFE и javaflow. Я знаю, что javaflow по крайней мере позволяет сериализовать состояние на диск:

A Continuation может быть сериализовано, если все объекты, которые он захватил, также сериализации. Другими словами, все локальные переменные (включая все thisобъекты) должны быть отмечены как Serializable. В этом примере вы нужно отметить класс MyRunnable как Сериализуемый. Сериализованный продолжение может быть отправлено другая машина или используется позже. - Учебное пособие Javaflow

Ответ 6

Я работал над встроенным проектом Java, который использовал этот подход для быстрого запуска. JVM был из Wind River, работающий поверх VxWorks.

Ответ 7

Sun провела некоторое исследование "ортогональной персистентности", которое обеспечивает "постоянство для полной вычислительной модели, определяемой спецификацией Java Language":

http://research.sun.com/forest/COM.Sun.Labs.Forest.doc.opjspec.abs.html

PJama - это прототип реализации:

http://research.sun.com/forest/opj.main.html

Ответ 8

Насколько я знаю, нет ничего, чтобы захватить состояние JVM и восстановить его, но люди пытаются сериализовать/десериализовать класс Thread для достижения чего-то подобного. Самое близкое к рабочему исполнению, которое я нашел, было brakes, но вы можете найти больше, когда вы google для "сериализации потоков".

Ответ 9

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

Интересно, сколько компонентов инфраструктуры и библиотек будет нарушено. Внезапно вы восстанавливаете состояние JVM из хранилища; в то же время часы таинственным образом пропустили вперед на 23 часа, сетевые соединения перестали быть действительными, объекты GUI больше не имеют каких-либо базовых ручек O/S... Я бы сказал, что это нетривиально и невозможно в общем случае без широко изменяя структуру.

Ответ 10

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

Однако он не сохраняет полное состояние JVM (стек вызовов, состояние GC и т.д.). Если вам действительно нужен этот уровень детализации, вам может понадобиться специализированная JVM.

Ответ 11

Ответ в это время нет, нет JVM, которые могут "спячки", как ваша операционная система может или как VMWare и другие.

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