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

若然,哪些?

有帮助吗?

解决方案

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

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

其他提示

Continuations 可能正是您所寻找的:

  

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

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

  

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

您应该序列化相关的特定于域的对象,这些对象可以被另一个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。根据您的具体需求,您可以考虑使用兵马俑。 Terracotta基本上能够在JVM之间共享堆状态,并将此状态存储到磁盘。

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

希望这有帮助。

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

Sun已经对“正交持久性”做了一些研究,“正交持久性”为完整的计算模型提供了“持久性”,即“Java语言规范&#64257;阳离子”:

http://research.sun的.com /森林/ COM.Sun.Labs.Forest.doc.opjspec.abs.html

PJama是一个原型实现:

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

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

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

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top