Другая опция, которая может или не может быть релевантной в Вашем случае, состоит в том, чтобы выполнить JVM (любая JVM) в виртуальной машине. Большинство виртуальных машин предлагает опцию сохранить и возобновить состояние, таким образом, Вы должны смочь перезапустить Ваш ПК, разжечь VM, когда это возвращается, и имейте погрузку процесса Java от того, где это было.
я использую VMware Player для тестирования на IE на работе, и это работает, как отмечено выше, когда я закрываю и позже вновь открыл его. Я обычно не делаю этого, когда приложения делают что-либо знаменитое в VM, но, пока они не получают доступ ни к каким внешним ресурсам (например, сетевые сокеты), я ожидал бы, что это будет работать, как будто VM никогда не закрывался.
Продолжения , вероятно, быть тем, что Вы ищете:
[...] продолжения первого класса, которые являются конструкциями, которые дают языку программирования способность сохранить режим выполнения в любой точке и возвратиться к той точке позже в программе.
существует по крайней мере две библиотеки продолжения для Java: РАСПРОСТРАНЕННЫЕ продолжения и javaflow. Я знаю, что javaflow, по крайней мере, позволяет сериализировать состояние к диску:
JavaflowА
Continuation
может быть сериализирован, если все объекты, которые он получил, также сериализуемые. Другими словами, все локальные переменные (включая весьthis
объекты) должны быть отмечены какSerializable
. В этом примере необходимо отметить класс MyRunnable как сериализуемый. Сериализированное продолжение может быть отправлено на другую машину или использоваться позже. - Учебное руководство
Необходимо сериализировать соответствующие проблемно-ориентированные объекты, которые могут быть десериализованы другим временем выполнения 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, которая может сохранить состояние. В зависимости от Ваших точных потребностей можно, возможно, рассмотреть использование Терракоты. Терракота по существу в состоянии совместно использовать состояние "кучи" между JVM и сохранить это состояние к диску.
Это может привыкнуть к кластерным приложениям и/или сделать heapstate персистентное. В действительности можно использовать его для запуска JVM и погрузки, где Вы кончили. Для получения дополнительной информации выезд: http://www.infoq.com/articles/open-terracotta-intro
Hope это помогает.
Я работал над встроенный проект Java, который использовал этот подход для запуска быстро. JVM была от реки Ветра, работающей сверху VxWorks.
Sun провел некоторое исследование на "ортогональной персистентности", которая обеспечивает "персистентность для полной вычислительной модели, которая является deп¬Ѓnedby Язык Java Speciп¬Ѓcation":
http://research.sun.com/forest/COM.Sun.Labs.Forest.doc.opjspec.abs.html
PJama является опытной реализацией:
К моему знанию нет ничего, чтобы получить состояние JVM и восстановить его, но люди пытаются сериализировать/десериализовать класс Потока для достижения чего-то подобного. Самая близкая вещь к рабочей реализации, которую я нашел, была тормоза , но можно найти больше, когда Вы гуглите для "сериализации потока".
Я беру его, Вы хотите быть в состоянии возобновиться от того, где снимок был сохранен, как будто ничего после этого не произошло.
интересно, сколько компонентов платформы и библиотек такая функциональность повредилась бы. Внезапно, Вы восстанавливаете состояние JVM от устройства хранения данных; тем временем часы загадочно пропустили вперед на 23 часа, сетевые соединения больше не действительны, объекты GUI больше не имеют никого лежащего в основе дескрипторов O/S... Я сказал бы, что это нетривиально, и невозможно в общем случае, не изменяя платформу экстенсивно.
Если можно сойти с рук просто хранение состояния объектов в оперативной памяти, то что-то как Prevaylor могло бы работать на Вас. Это использует комбинацию журналирования изменений в бизнес-объектах с сериализированным снимком для записи состояния объектов, которые можно тогда перезагрузить позже.
Однако это не хранит полное состояние JVM (стек вызовов, состояние GC и т.д.). Если Вам действительно нужен тот уровень детализации, то специализированная JVM могла бы быть необходима.
Ответ в это время никакой , нет никаких JVMs, которые могут 'быть в спящем режиме' как Ваша операционная система, может, или как VMware и др. может.
Вы могли становиться промежуточными там, в зависимости от сложности Вашего приложения, просто сериализировав состояние, когда завершения программы и сериализация его въезжают задним ходом, но так не пойдет материал как пауза, выполняющая некоторую бизнес-логику, когда Вы закрываетесь и затем продолжаете при открытии его снова.