JVM可以提供快照持久性吗?

是否可以转储正在运行的JVM的映像,然后通过将映像加载到JVM中来恢复以前的状态? 我相当肯定答案是消极的,但我会喜欢错。

随着JVM可用的所有动态语言增加了交互性,能够保存编码会话将有助于节省手动将VM还原到先前会话的时间。

有一段时间提出了一个JSR 323,但它被拒绝了 。 您可以在这些文章中找到有关此背后的研究及其需要的一些链接。 它主要被拒绝为一个太不成熟的想法。

我听说至少有一家创业公司(不幸的是不记得这个名字)正在通过虚拟机管理程序(可能是Xen)开发虚拟化技术,这种虚拟机技术已经非常接近能够移动JVM,甚至包括文件系统引用等。和套接字端点。 因为他们处于管理程序级别,所以他们可以访问所有这些内容。 通过挂钩和JVM,他们拥有大部分内容。 我想他们可能已经失败了。

今天最接近的是Terracotta ,它允许您集群JVM堆的一部分,将其存储在服务器arrays中,这可以是持久的。 在JVM启动时,您连接到群集并可以继续使用堆的任何部分指定为群集。 实际对象根据需要出现故障。

目前不可能。 通常,在不同的上下文中暂停和重新启动进程的内存映像是非常难以实现的:您打算如何处理打开的OS资源? 转移到具有不同指令集的机器? 数据库连接?

运行JVM的图像可能非常大 – 可能比您实际感兴趣的状态子集大得多。因此从性能角度来看,这不是一个好主意。

更好的策略是使代码持久化并重新创建应用程序状态 :对于大多数JVM动态语言而言,这是相对可行的。 我在Clojure中做了类似的事情,你有一个交互式环境(REPL),很有可能创建并运行一系列操作来重建你想要在另一个JVM中的应用程序状态。

目前在我所知道的任何JVM中都不可能实现这一点。 如果程序与其环境断开连接,那么在JVM中实现类似的function并不是很困难。 但是,许多程序都有钩入它们的环境(想想文件句柄,数据库连接),这会使实现这样的东西变得非常毛茸茸。