Существуют ли какие-либо виртуальные машины Java, которые могут сохранять свое состояние в файле, а затем перезагрузить это состояние?
Существуют ли какие-либо виртуальные машины Java, которые могут сохранить свое состояние в файле, а затем перезагрузить это состояние?
Если да, то какие?
Ответы
Ответ 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 и другие.
Вы можете получить на полпути там, в зависимости от сложности вашего приложения, просто сериализуя состояние, когда программа закрывается и сериализуется обратно, но это не будет делать такие вещи, как пауза, выполняющая некоторую бизнес-логику, когда вы закрываете и затем продолжайте, когда вы снова откроете его.