Существуют ли какие-либо виртуальные машины Java, которые могут сохранить свое состояние в файле, а затем перезагрузить это состояние?
Если да, то какие?
Существуют ли какие-либо виртуальные машины Java, которые могут сохранить свое состояние в файле, а затем перезагрузить это состояние?
Если да, то какие?
Другим вариантом, который может быть или не быть уместным в вашем случае, является запуск JVM (любой JVM) внутри виртуальной машины. Большинство виртуальных машин предлагают возможность сохранять и возобновлять состояние, поэтому вы должны иметь возможность перезагрузить компьютер, запускать виртуальную машину при ее резервном копировании и запускать процесс Java с того места, где он был.
Я использую VMWare Player для тестирования IE на работе, и это работает, как указано выше, когда я закрываю и позже открываю его. Обычно я это делаю, когда приложения ничего не замечают в виртуальной машине, но пока они не получают доступа к каким-либо внешним ресурсам (например, сетевым сокетам), я ожидаю, что он будет работать так, как если бы VM никогда не закрывалась.
Вы должны сериализовать релевантные объекты, специфичные для домена, которые могут быть де-сериализованы другой версией 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
Я не думаю, что вы еще собираетесь найти решение, которое переносится между архитектурами.
Стоит отметить, что многие объекты не могут быть сериализованы, поскольку они имеют состояние вне контекста java. например Сокеты, потоки, открытые файлы, соединения с базой данных. По этой причине сложно сохранить состояние полезного приложения в общем виде.
Я не знаю JVM, который может хранить состояние. В зависимости от ваших конкретных потребностей, вы можете, возможно, рассмотреть возможность использования Terracotta. Терракота по существу способна делиться состоянием кучи между JVM и сохранять это состояние на диск.
Это можно использовать для кластеризации приложений и/или для сохранения состояния кучи. Фактически, вы можете использовать его, чтобы запустить JVM вверх и забрать, где вы остановились. Для получения дополнительной информации проверьте: http://www.infoq.com/articles/open-terracotta-intro
Надеюсь, что это поможет.
Продолжение, вероятно, будет тем, что вы ищете:
[...] продолжения первого класса, которые являются конструкциями которые дают язык программирования возможность сохранения состояния выполнения при любой точки и вернуться к этой точке в более поздняя точка в программе.
Для Java существует как минимум две библиотеки продолжения: продолжения RIFE и javaflow. Я знаю, что javaflow по крайней мере позволяет сериализовать состояние на диск:
A
Continuation
может быть сериализовано, если все объекты, которые он захватил, также сериализации. Другими словами, все локальные переменные (включая всеthis
объекты) должны быть отмечены какSerializable
. В этом примере вы нужно отметить класс MyRunnable как Сериализуемый. Сериализованный продолжение может быть отправлено другая машина или используется позже. - Учебное пособие Javaflow
Я работал над встроенным проектом Java, который использовал этот подход для быстрого запуска. JVM был из Wind River, работающий поверх VxWorks.
Sun провела некоторое исследование "ортогональной персистентности", которое обеспечивает "постоянство для полной вычислительной модели, определяемой спецификацией Java Language":
http://research.sun.com/forest/COM.Sun.Labs.Forest.doc.opjspec.abs.html
PJama - это прототип реализации:
Насколько я знаю, нет ничего, чтобы захватить состояние JVM и восстановить его, но люди пытаются сериализовать/десериализовать класс Thread для достижения чего-то подобного. Самое близкое к рабочему исполнению, которое я нашел, было brakes, но вы можете найти больше, когда вы google для "сериализации потоков".
Полагаю, вы хотите, чтобы вы могли возобновить работу с момента хранения моментального снимка, как будто ничего не произошло.
Интересно, сколько компонентов инфраструктуры и библиотек будет нарушено. Внезапно вы восстанавливаете состояние JVM из хранилища; в то же время часы таинственным образом пропустили вперед на 23 часа, сетевые соединения перестали быть действительными, объекты GUI больше не имеют каких-либо базовых ручек O/S... Я бы сказал, что это нетривиально и невозможно в общем случае без широко изменяя структуру.
Если вам удастся просто сохранить состояние ваших объектов в памяти, то что-то вроде Prevaylor может сработать для вас. Он использует комбинацию журнальных изменений бизнес-объектов с сериализованным моментальным снимком для записи состояния ваших объектов, которые затем можно перезагрузить позже.
Однако он не сохраняет полное состояние JVM (стек вызовов, состояние GC и т.д.). Если вам действительно нужен этот уровень детализации, вам может понадобиться специализированная JVM.
Ответ в это время нет, нет JVM, которые могут "спячки", как ваша операционная система может или как VMWare и другие.
Вы можете получить на полпути там, в зависимости от сложности вашего приложения, просто сериализуя состояние, когда программа закрывается и сериализуется обратно, но это не будет делать такие вещи, как пауза, выполняющая некоторую бизнес-логику, когда вы закрываете и затем продолжайте, когда вы снова откроете его.