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

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

如果是这样,哪些?

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

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

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

我不知道任何工具持久化整个JVM。 我最接近的是使用gcore从正在运行的JVM进程创建核心转储,然后使用jsadebugd , jmap或jstack进行调试。

例如:

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

UPDATE

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

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

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

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

希望这可以帮助。

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

[…]第一类延续,它是一种结构,它使编程语言能够在任何点保存执行状态,并在程序的稍后阶段返回到该点。

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

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

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

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

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

PJama是一个原型实现:

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

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

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

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

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

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

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

根据应用程序的复杂程度,您可以在中途完成,只需在程序关闭时序列化状态并将其序列化,但这样做不会像关闭然后继续执行某些业务逻辑那样当你再次打开它。