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

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

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

Ответы [ 11 ]

11 голосов
/ 08 января 2009

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

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

5 голосов
/ 10 марта 2009

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

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

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

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

4 голосов
/ 09 марта 2009

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

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

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

4 голосов
/ 07 марта 2009

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

4 голосов
/ 08 января 2009

Вам следует сериализовать соответствующие доменные объекты, которые могут быть десериализованы другой средой выполнения 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 голосов
/ 07 марта 2009

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

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

PJama является прототипом реализации:

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

3 голосов
/ 08 января 2009

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

2 голосов
/ 11 марта 2009

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

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

2 голосов
/ 07 марта 2009

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

1 голос
/ 11 марта 2009

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

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

...