是否有任何Java VM可以将其状态保存到文件然后重新加载该状态?

时间:2009-01-08 14:06:55

标签: java persistence virtual-machine

是否有任何Java VM可以将其状态保存到文件然后重新加载该状态?

若然,哪些?

11 个答案:

答案 0 :(得分:11)

另一个选项(在您的情况下可能相关或不相关)是在虚拟机内运行JVM(任何JVM)。大多数虚拟机都提供了存储和恢复状态的选项,因此能够重新启动PC,在VM恢复时启动虚拟机并让Java进程从原来的位置恢复。

我在工作时使用VMWare Player进行IE测试,当我关闭并稍后重新打开它时,这就像上面所说的那样工作。我通常不会在应用程序在VM中执行任何操作时执行此操作,但只要它们不访问任何外部资源(例如网络套接字),我希望它能够像VM永远不会关闭一样工作

答案 1 :(得分:5)

Continuations可能正是您所寻找的:

  

[...]第一类延续,是构造   给出一种编程语言   能够保存执行状态   任何一点,并返回到那一点   该计划的后一点。

至少有两个Java继续库:RIFE continuationsjavaflow。我知道javaflow至少允许将状态序列化为磁盘:

  

如果Continuation可以序列化   它捕获的所有对象也是   序列化。换句话说,所有的   局部变量(包括所有this   对象)需要标记为   Serializable。在这个例子中,你   需要将MyRunnable类标记为   可序列化。一个序列化的   延续可以发送到   另一台机器或以后使用。 - Javaflow Tutorial

答案 2 :(得分:4)

您应该序列化相关的特定于域的对象,这些对象可以被另一个JVM运行时反序列化。

我不知道有任何工具持久存在整个JVM。我最接近这样做的是使用gcore从正在运行的JVM进程创建核心转储,然后使用jsadebugdjmapjstack进行调试。

例如:

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

<强>更新

我认为你不会找到一种可以在架构之间移植的解决方案。

答案 3 :(得分:4)

值得注意的是,许多对象无法序列化,因为它们在java上下文之外具有状态。 例如套接字,线程,打开文件,数据库连接。 因此,很难以通用的方式保存有用的应用程序的状态。

答案 4 :(得分:4)

我不知道可以存储状态的JVM。根据您的具体需求,您可以考虑使用兵马俑。 Terracotta基本上能够在JVM之间共享堆状态,并将此状态存储到磁盘。

这可以用于集群应用程序,和/或使heapstate持久化。实际上,您可以使用它来启动JVM并从中断的地方继续。有关更多信息,请查看: http://www.infoq.com/articles/open-terracotta-intro

希望这有帮助。

答案 5 :(得分:3)

我曾使用过这种方法的an embedded Java project快速启动。 JVM来自Wind River,运行在VxWorks之上。

答案 6 :(得分:3)

Sun已经对“正交持久性”做了一些研究,它提供了“由Java语言规范定义的完整计算模型的持久性”:

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

PJama是一个原型实现:

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

答案 7 :(得分:2)

据我所知,没有什么可以捕获JVM状态并恢复它,但人们正在尝试序列化/反序列化Thread类以实现类似的东西。我找到的最接近工作实现的是brakes,但是当您使用Google进行“线程序列化”时,您可能会发现更多内容。

答案 8 :(得分:2)

我认为你希望能够从存储快照的地方恢复,就像之后没有发生任何事情一样。

我想知道有多少框架组件和库会破坏这些功能。突然间,您正在从存储中恢复JVM状态;与此同时,时钟已经神秘地跳过了23个小时,网络连接不再有效,GUI对象不再有任何潜在的操作手柄...我会说这是不平凡的,一般情况下不可能没有广泛地修改框架。

答案 9 :(得分:1)

如果您只是存储内存中对象的状态,那么Prevaylor之类的内容可能适合您。它将业务对象的日志记录更改与序列化快照结合使用,以记录对象的状态,然后可以稍后重新加载。

但是,它不存储完整的JVM状态(调用堆栈,GC状态等)。如果您确实需要这种级别的详细信息,则可能需要专门的JVM。

答案 10 :(得分:1)

目前的答案是没有,没有像你的操作系统一样可以“休眠”的JVM,或者像VMWare等人那样。

可以在那里中途,取决于应用程序的复杂性,只需在程序关闭时序列化状态并将其序列化,但这不会像暂停一样当你关闭时执行一些业务逻辑,然后当你再次打开它时继续。