将Java程序转储到文件中并重新启动它

时间:2012-01-26 19:19:02

标签: java

我只是想知道是否可以将正在运行的Java程序转储到文件中,然后重新启动它(同一台机器)

这听起来有点奇怪,但谁知道

---更新-------

是的,这是进程的休眠功能,而不是完整系统。但谷歌'休眠jvm过程',你会明白我的痛苦。

Linux上有一个关于此主题的问题(here)。很快,就可以使用CryoPID来暂停一个进程(远非100%可靠)。

几年前在stackoverflow提出了类似的问题。

对于JVM,我有根据的猜测是,休眠应该更容易,并非总是可行,并且在100%时不可靠(例如UI和文件)。


序列化应用程序的持久状态是一种选择,但它不是问题的答案。

10 个答案:

答案 0 :(得分:10)

这可能有点矫枉过正,但你可以做的一件事就是运行VirtualBox之类的东西并暂停/保存机器。

还有:
  - JavaFlow from Apache即使我没有亲自尝试,也应该这样做 它。
  - Brakes可能正是您正在寻找的

答案 1 :(得分:8)

对您的问题的任何解决方案都有很多限制:所有外部连接可能会或可能不会在您尝试冻结和唤醒它们时存活。想想另一方面的超时,甚至停止通信伙伴 - 从Web服务器到数据库甚至本地文件的任何事情。

您要求一个通用的解决方案,在没有任何内部程序知识的情况下,您想要休眠。您可以随时执行的操作是序列化程序状态的一部分,即重启程序所需的部分。在长时间运行的计算(想想几天或几周)中实现重启点是或者至少是常识。因此,当您在程序运行一周后遇到错误时,可以修复错误并节省一些计算日。

与使用的完整内存大小相比,程序的状态可能会非常小。

您问“是否可以将正在运行的Java程序转储到文件中,然后重新启动它”。 - 是的,但我不会建议一个通用的自动解决方案,必须将你的程序作为一个黑盒子来处理,但我建议你将程序状态和程序重启点的重要部分外部化。

希望有所帮助 - 即使它比你希望的更复杂。

答案 2 :(得分:7)

我相信OP所询问的是Smalltalk人员几十年来一直在做的事情 - 将整个编程/执行环境存储在一个图像文件中,并对其进行处理。

AFAIK在Java中无法做同样的事情。

答案 3 :(得分:7)

已经进行了一些研究,“持久化”JVM的执行状态,然后将其移动到另一个JVM并再次启动它。看过一次展示但不记得哪一个。不要认为它已经在JVM规范中标准化了......

找到了我正在考虑的演示文稿/演示,它是在OOPSLA 2005,他们在讨论squawk

祝你好运!

其他感兴趣的链接: Merpati

Aglets

M-JavaMPI

答案 4 :(得分:3)

使用SpringBatch框架怎么样?

据我所知,你需要一些可靠且可恢复的java任务,如果是这样的话,我相信Spring Batch会发挥神奇作用,因为你可以在每一步中将你的任务(工作)分成几个步骤(和整个作业也有自己的执行上下文持久存储到您选择使用的存储中。

如果发生崩溃,您可以通过分析以前的特定作业运行来恢复,并从发生故障的确切位置恢复。

如果作业已配置为可重新启动且此作业的ExecutionContext已存在,您也可以暂停和restart your job programmatically

祝你好运!

答案 5 :(得分:3)

我相信: 1-唯一通用的方法是实现序列化。 2-恢复正在运行的系统的一个好方法是操作系统虚拟化 3-现在你要问的是单进程序列化。

问题是IO。    表示您的进程使用临时文件,该文件在之后被系统删除    'hybernation',但你的程序不知道它。您将有一个IOException    某处。

所以,如果程序不是设计为随机中断,它将无效。    这是一个风险和不可靠的解决方案,所以我相信只有1,2才有意义。

答案 6 :(得分:2)

我猜IDE支持以这种方式进行调试。虽然我不知道如何,但这并非不可能。如果您联系某个日食或netbeans贡献者,可能会得到详细信息。

答案 7 :(得分:0)

首先,您需要设计应用程序以使用Memento pattern或任何其他允许您保存应用程序状态的模式。观察者模式也可能是一种可能性。一旦您的代码以可以保存状态的方式构建,您就可以使用Java序列化将所有对象实际写入文件而不是将其放入数据库中。

只需2美分。

答案 8 :(得分:0)

从计算机体系结构的本质来看,你想要的是不可能的。

每个Java程序都被编译成Java中间代码,然后将此代码解释为本机平台代码(运行时)。本机代码与您在Java文件中看到的完全不同,因为它依赖于下划线平台和JVM版本。每个平台都有不同的指令集,内存管理,驱动程序系统等等......想象一下,你在Windows上休眠你的程序,然后在Linux,Mac或任何其他带有JRE的设备上运行它,如手机,汽车,读卡器等等......一切都会破裂。

您的解决方案是将每个重要对象序列化为文件,然后正常关闭程序。当“unhibernating”时,您从这些文件反序列化这些实例,您的程序可以继续。 “重要”实例的数量可能非常少,您只需要保存“业务数据”,其他所有内容都可以从这些数据中重建。您可以使用Hibernate或任何其他ORM框架在SQL数据库之上自动化此序列化。

答案 9 :(得分:0)

可能兵马俑可以:http://www.terracotta.org

我不确定但是他们支持服务器故障。如果所有服务器都停止,则该进程应保存到磁盘并等待我认为。

否则,您应该重构您的应用程序以明确保持状态。例如,如果你实现类似runnable的东西并使其成为Serializable,你就可以保存它。