是否有任何Java VM可以将其状态保存到文件然后重新加载该状态?
若然,哪些?
答案 0 :(得分:11)
另一个选项(在您的情况下可能相关或不相关)是在虚拟机内运行JVM(任何JVM)。大多数虚拟机都提供了存储和恢复状态的选项,因此应能够重新启动PC,在VM恢复时启动虚拟机并让Java进程从原来的位置恢复。
我在工作时使用VMWare Player进行IE测试,当我关闭并稍后重新打开它时,这就像上面所说的那样工作。我通常不会在应用程序在VM中执行任何操作时执行此操作,但只要它们不访问任何外部资源(例如网络套接字),我希望它能够像VM永远不会关闭一样工作
答案 1 :(得分:5)
Continuations可能正是您所寻找的:
[...]第一类延续,是构造 给出一种编程语言 能够保存执行状态 任何一点,并返回到那一点 该计划的后一点。
至少有两个Java继续库:RIFE continuations和javaflow。我知道javaflow至少允许将状态序列化为磁盘:
如果
Continuation
可以序列化 它捕获的所有对象也是 序列化。换句话说,所有的 局部变量(包括所有this
对象)需要标记为Serializable
。在这个例子中,你 需要将MyRunnable类标记为 可序列化。一个序列化的 延续可以发送到 另一台机器或以后使用。 - Javaflow Tutorial
答案 2 :(得分:4)
您应该序列化相关的特定于域的对象,这些对象可以被另一个JVM运行时反序列化。
我不知道有任何工具持久存在整个JVM。我最接近这样做的是使用gcore从正在运行的JVM进程创建核心转储,然后使用jsadebugd,jmap或jstack进行调试。
例如:
$ 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是一个原型实现:
答案 7 :(得分:2)
据我所知,没有什么可以捕获JVM状态并恢复它,但人们正在尝试序列化/反序列化Thread类以实现类似的东西。我找到的最接近工作实现的是brakes,但是当您使用Google进行“线程序列化”时,您可能会发现更多内容。
答案 8 :(得分:2)
我认为你希望能够从存储快照的地方恢复,就像之后没有发生任何事情一样。
我想知道有多少框架组件和库会破坏这些功能。突然间,您正在从存储中恢复JVM状态;与此同时,时钟已经神秘地跳过了23个小时,网络连接不再有效,GUI对象不再有任何潜在的操作手柄...我会说这是不平凡的,一般情况下不可能没有广泛地修改框架。
答案 9 :(得分:1)
如果您只是存储内存中对象的状态,那么Prevaylor之类的内容可能适合您。它将业务对象的日志记录更改与序列化快照结合使用,以记录对象的状态,然后可以稍后重新加载。
但是,它不存储完整的JVM状态(调用堆栈,GC状态等)。如果您确实需要这种级别的详细信息,则可能需要专门的JVM。
答案 10 :(得分:1)
目前的答案是没有,没有像你的操作系统一样可以“休眠”的JVM,或者像VMWare等人那样。
你可以在那里中途,取决于应用程序的复杂性,只需在程序关闭时序列化状态并将其序列化,但这不会像暂停一样当你关闭时执行一些业务逻辑,然后当你再次打开它时继续。