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

StackOverflow https://stackoverflow.com/questions/424341

Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

  

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

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

  

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

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

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

Например:

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

Обновить

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

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

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

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

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

Я работал над встроенным Java-проектом , в котором использовался этот подход, чтобы начать быстро. JVM была из Wind River и работала на вершине VxWorks.

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

http: //research.sun .com / лес / COM.Sun.Labs.Forest.doc.opjspec.abs.html

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

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

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

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

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

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

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

В настоящее время ответом является нет , нет таких виртуальных машин Java, которые могли бы «впасть в спячку», как ваша операционная система или как VMWare и другие.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top