17

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

如果有,有哪些?

4

11 回答 11

12

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

我在工作中使用 VMWare Player 在 IE 上进行测试,当我关闭并稍后重新打开它时,它的工作原理如上所述。当应用程序在虚拟机中做任何值得注意的事情时,我通常不会这样做,但只要它们不访问任何外部资源(例如网络套接字),我希望它能够像虚拟机从未关闭一样工作.

于 2009-01-08T16:56:23.227 回答
5

延续可能是您正在寻找的:

[...] 第一类延续,这些结构使编程语言能够在任何时候保存执行状态,并在程序的稍后点返回到该点。

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

如果AContinuation捕获的所有对象也是可序列化的,则它可以被序列化。换句话说,所有的局部变量(包括所有的this 对象)都需要标记为 Serializable. 在此示例中,您需要将 MyRunnable 类标记为 Serializable 。序列化的延续可以发送到另一台机器或稍后使用。- Javaflow 教程

于 2009-03-10T10:51:37.343 回答
4

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

我不知道有任何工具可以持久化整个 JVM。我最接近的方法是使用 gcore 从正在运行的 JVM 进程创建核心转储然后使用jsadebugdjmapjstack对其进行调试。

例如:

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

更新

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

于 2009-01-08T15:50:40.253 回答
4

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

于 2009-03-06T21:18:11.663 回答
4

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

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

希望这可以帮助。

于 2009-03-09T14:50:22.070 回答
3

我从事过一个嵌入式 Java 项目,该项目使用这种方法快速启动。JVM 来自 Wind River,运行在 VxWorks 之上。

于 2009-01-08T16:30:04.293 回答
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

于 2009-03-07T19:56:15.657 回答
2

据我所知,没有什么可以捕获 JVM 状态并恢复它,但是人们正在尝试序列化/反序列化 Thread 类以实现类似的功能。我发现的最接近工作实现的是刹车,但是当你用谷歌搜索“线程序列化”时,你可能会发现更多。

于 2009-03-06T21:05:59.647 回答
2

我认为您希望能够从存储快照的位置恢复,就好像此后没有发生任何事情一样。

我想知道这样的功能会破坏多少框架组件和库。突然,您正在从存储中恢复 JVM 状态;与此同时,时钟神秘地向前跳了 23 小时,网络连接不再有效,GUI 对象不再有任何底层的 O/S 句柄......我想说这是不平凡的,在一般情况下,如果没有广泛修改框架。

于 2009-03-11T11:38:02.887 回答
1

如果您可以摆脱只存储内存中对象的状态,那么像Prevaylor这样的东西可能对您有用。它使用对业务对象的日志更改与序列化快照的组合来记录对象的状态,然后您可以稍后重新加载这些状态。

但是,它不存储完整的 JVM 状态(调用堆栈、GC 状态等)。如果您真的需要这种详细程度,那么可能需要专门的 JVM。

于 2009-03-09T00:44:20.277 回答
1

目前的答案是否定的,没有 JVM 可以像您的操作系统或 VMWare 等那样“休眠”。

根据应用程序的复杂性,您可以通过仅在程序关闭时将状态序列化并将其重新序列化来实现中途,但这不会像在您关闭然后继续时暂停执行某些业务逻辑这样的事情当你再次打开它时。

于 2009-03-11T19:47:46.750 回答