2012-01-26 27 views
15

我只是想知道如果有可能倾倒运行中的Java程序到文件,后来就重新启动它(同一台机器)倾销Java程序到文件,并重新启动它

这听起来有点不可思议,但谁知道

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

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

在这个问题上有一个关于linux的问题(here)。很快,可以使用CryoPID将进程休眠(远离100%可靠)。

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

对于JVM,我的教育猜测是休眠应该容易很多,并不总是可能的,并且在100%(例如UI和文件)下不可靠。


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

+0

你的意思是创建一个保存文件? – Max

+0

数十年前,我记得阅读过有关如何在运行awk程序时核心转储awk解释器,然后从核心文件重新启动awk解释器的说明。当时我觉得这很疯狂。 –

+0

这听起来很奇怪。您是否正在谈论将正在运行的Java程序的源代码转储到文本文件中,编译此源代码并运行它? – Bernard

回答

10

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

还有:
- JavaFlow from Apache应该做到这一点,尽管我还没有亲自试过 它。
- Brakes可能你在寻找什么

+0

这个问题/答案还建议去虚拟机路由:http://stackoverflow.com/questions/424341/are-there-any-java-vms-which-can-save-their- state-to-a-file-and-then-reload- – jefflunt

7

我相信什么OP是问什么是Smalltalk的人已经做了几十年 - 整个编程/执行环境中存储的图像文件,并且工作在上面。

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

+0

你可以用Smalltalk做到这一点吗?有没有这个功能的名称,所以我可以谷歌它? – Ajedi32

+0

寻找如何保存Smalltalk _image_,这应该让你在正确的轨道上;) –

7

在“坚持”JVM的执行状态,然后将其移至另一个JVM并再次启动时,已经有一些研究。看过一次展示过的东西,但不记得是哪一个。不要以为它已经在JVM规范虽然已经标准化...

找到演示/演示中,我在想,这是2005年OOPSLA,他们都在谈论squawk

祝你好运!

关注其他链接: Merpati

Aglets

M-JavaMPI

+0

谢谢,越来越近 – ic3

+0

祝你好运,并发布回来,如果你找到一个很好的解决方案:) –

2

我想IDE支持这样的调试。这不是不可能的,尽管我不知道如何。可能你会得到详细信息,如果你联系一些eclipse或netbeans contributer。

7

对于您的问题,任何解决方案都会有很多限制:所有外部连接可能会或可能无法在您试图冻结并唤醒它们之后继续存在。考虑另一方面的超时,或者甚至停止通信伙伴 - 从Web服务器到数据库甚至本地文件的任何事情。

您正在寻求一种通用的解决方案,无需您的程序的任何内部知识,您想要休眠。你总是可以做的,就是序列化你的程序状态的一部分,你需要重新启动你的程序。在长时间运行计算中实施重启点(想想几天或几周)是或者至少是常识。因此,当您运行一周后在程序中遇到错误时,您可以修复该错误并节省一些计算时间。

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

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

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

+1

让我们采取的情况下,没有外部资源(文件,数据库,连接...) – ic3

+0

如果这是一个真实世界的问题,你的应用程序做什么:它是一个游戏,数字计算器,模拟? –

+0

这是一个真正的世界问题,它是一个OLAP服务器(谷歌iccube) – ic3

3

如何使用SpringBatch框架?我认为你需要一些可靠的和可恢复的Java任务,如果是的话,我相信Spring Batch会做到这一点,因为你可以将任务(工作)分成几个步骤,而每一步(以及整个作业)都有其自己的执行上下文持久存储到您选择使用的存储中。

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

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

祝你好运!

0

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

只需2美分。

0

你想要的是从计算机体系结构本质上不可能实现的。每个Java程序都被编译成Java中间代码,然后这段代码被解释为本地平台代码(运行时)。本机代码与您在Java文件中看到的代码非常不同,因为它取决于底线平台和JVM版本。每个平台都有不同的指令集,内存管理,驱动程序系统等等......所以想象你在Windows上休眠你的程序,然后在Linux,Mac或任何其他带有JRE的设备上运行它,例如移动电话,汽车,读卡器等等......所有的地狱都会破裂。

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

+0

问题不是在一个操作系统中休眠,而是开始另一个操作系统。 – ic3

+0

我以为你要求休眠JVM的状态。那个文件就可以转移到任何其他计算机上。 –

+0

如果可能的话,这将是伟大的 – ic3

0

大概兵马俑可以这样:http://www.terracotta.org

我不知道,但他们支持服务器故障。如果所有的服务器都停下来,这个过程应该保存到磁盘上,等待我的想法

否则,您应该重构您的应用程序以明确保持状态。例如,如果你实现了像runnable这样的东西,并使其可串行化,你将能够保存它。

3

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

问题是IO。 说你的程序使用一个临时文件,在 'hybernation'之后被系统删除,但你的程序不知道它。某处会出现IOException 。

所以说的是,如果程序不是被设计成随机中断的,那么它将不起作用。 这是一个危险的和不可取的解决方案,所以我相信只有1,2有意义。

相关问题