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

17
задан Kara 21 June 2013 в 21:59
поделиться

11 ответов

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

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

11
ответ дан 30 November 2019 в 11:27
поделиться

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

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

существует по крайней мере две библиотеки продолжения для Java: РАСПРОСТРАНЕННЫЕ продолжения и javaflow. Я знаю, что javaflow, по крайней мере, позволяет сериализировать состояние к диску:

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

Javaflow
5
ответ дан 30 November 2019 в 11:27
поделиться

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

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

, Например:

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

ОБНОВЛЕНИЕ

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

4
ответ дан 30 November 2019 в 11:27
поделиться

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

4
ответ дан 30 November 2019 в 11:27
поделиться

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

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

Hope это помогает.

4
ответ дан 30 November 2019 в 11:27
поделиться

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

3
ответ дан 30 November 2019 в 11:27
поделиться

Sun провел некоторое исследование на "ортогональной персистентности", которая обеспечивает "персистентность для полной вычислительной модели, которая является deп¬Ѓnedby Язык Java Speciп¬Ѓcation":

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

PJama является опытной реализацией:

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

3
ответ дан 30 November 2019 в 11:27
поделиться

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

2
ответ дан 30 November 2019 в 11:27
поделиться

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

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

2
ответ дан 30 November 2019 в 11:27
поделиться

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

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

1
ответ дан 30 November 2019 в 11:27
поделиться

Ответ в это время никакой , нет никаких JVMs, которые могут 'быть в спящем режиме' как Ваша операционная система, может, или как VMware и др. может.

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

1
ответ дан 30 November 2019 в 11:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: