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

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

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

—更新——-

是的,这是进程的hibernatefunction,而不是完整系统。 但是google’hibernate jvm process’你会理解我的痛苦。

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

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

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


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

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

还有:
– 来自Apache的JavaFlow即使我没有亲自尝试过,也应该这样做。
– 制动器可能正是您正在寻找的

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

AFAIK没有办法在Java中做同样的事情。

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

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

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

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

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

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

找到了我正在考虑的演示文稿/演示,正是在OOPSLA 2005,他们正在谈论尖叫

祝你好运!

其他感兴趣的链接: Merpati

小任务

M-JavaMPI

使用SpringBatch框架怎么样?

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

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

如果作业已配置为可重新启动且此作业的ExecutionContext已存在,您还可以以编程方式暂停和重新启动作业 。

祝你好运!

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

问题是IO。 说你的进程使用一个临时文件,在’hybernation’后系统会删除它,但你的程序不知道它。 你会在某处遇到IOException。

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

我想IDE支持以这种方式进行调试。 虽然我不知道如何,但这并非不可能。 如果你联系一些eclipse或netbeans贡献者,你可能会得到详细信息。

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

差不多2美分。

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

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

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

也许Terracotta可以这样: http : //www.terracotta.org

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

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