JVM 能否提供快照持久性?
是否可以转储正在运行的 JVM 的映像,然后通过将映像加载到 JVM 中来恢复以前的状态?我相当确定答案是否定的,但很想错了。
随着所有可用于 JVM 的动态语言,交互性的提高,能够保存编码会话将有助于节省手动将 VM 还原到上一个会话的时间。
是否可以转储正在运行的 JVM 的映像,然后通过将映像加载到 JVM 中来恢复以前的状态?我相当确定答案是否定的,但很想错了。
随着所有可用于 JVM 的动态语言,交互性的提高,能够保存编码会话将有助于节省手动将 VM 还原到上一个会话的时间。
不久前有人为此提出了JSR 323,但被拒绝了。您可以在这些文章中找到一些关于这背后的研究以及需要什么的链接。它大多被拒绝,因为这个想法太不成熟了。
我听说过至少有一家初创公司(不幸的是,我不记得这个名字了)正在开发一种虚拟化技术,而不是虚拟机管理程序(可能是Xen),它非常接近能够移动JVM,甚至包括文件系统引用和套接字端点之类的东西。因为他们处于虚拟机管理程序级别,所以他们可以访问所有这些东西。通过连接它和JVM,他们拥有了大部分部分。我想他们可能已经倒下了。
您今天可以获得的最接近的东西是Terracotta,它允许您集群JVM堆的一部分,将其存储在服务器数组中,该数组可以持久化。在 JVM 启动时,您可以连接到集群,并且可以继续使用堆中指定为集群的任何部分。实际对象会根据需要进行故障处理。
目前无法实现。通常,在不同的上下文中暂停并重新启动进程的内存映像是非常困难的:您将如何处理开放的操作系统资源?传输到具有不同指令集的机器?数据库连接?
此外,正在运行的 JVM 的图像可能相当大 - 可能比您实际感兴趣的状态子集大得多。因此,从性能角度来看,这不是一个好主意。
一个更好的策略是让代码持久化并重新创建应用程序状态:这对于大多数JVM动态语言来说是相对可行的。我在Clojure中做了类似的事情,在那里你有一个交互式环境(REPL),并且很有可能创建并运行一系列操作,以在另一个JVM中重建您想要的应用程序状态。