【问题标题】:Can the JVM provide snapshot persistence?JVM可以提供快照持久化吗?
【发布时间】:2009-03-04 15:44:19
【问题描述】:

是否可以转储正在运行的 JVM 的图像,然后通过将图像加载到 JVM 中来恢复之前的状态?我相当肯定答案是否定的,但我很想弄错。

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

【问题讨论】:

  • 这在网格计算中非常有用,在这种计算中,人们可能希望将他的进程移动到网格中负载较轻的机器上。创建可恢复的快照将是一个巨大的胜利。小伙伴们请三思。

标签: java jvm


【解决方案1】:

不久前有一个JSR 323 proposed for this,但它是rejected。您可以在这些文章中找到一些链接,了解这背后的研究及其需要采取的措施。它大多被认为是一个太不成熟的想法而被拒绝。

我听说至少有一家初创公司(遗憾的是不记得名字了)正在通过虚拟机管理程序(可能是 Xen)开发一种虚拟化技术,该虚拟化技术已经非常接近能够移动 JVM,甚至包括类似的东西文件系统参考和套接字端点。因为他们处于管理程序级别,所以他们可以访问所有这些东西。通过将它和 JVM 挂钩,他们拥有了大部分内容。我认为他们可能已经破产了。

您今天可以获得的最接近的东西是Terracotta,它允许您将 JVM 堆的一部分集群化,将其存储在一个服务器数组中,该数组可以持久化。在 JVM 启动时,您连接到集群并可以继续使用指定为集群的堆的任何部分。实际对象会根据需要进行故障处理。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我们曾经用 Smalltalk vm/images 来做这件事...对于调试客户端问题非常有用...冻结图像,将其带回 basecamp 并从我们停止的行中逐步执行代码客户网站。在许多情况下,我们并不关心与外部文件系统、数据库、套接字的所有连接……我们只需要浏览客户端站点上存在的各种内部数据结构。
    【解决方案3】:

    目前这在我所知道的任何 JVM 中都是不可能的。如果程序在与环境断开连接的情况下运行,那么在 JVM 中实现这样的事情并不是很困难。然而,许多程序在它们的环境中都有挂钩(想想文件句柄、数据库连接),这会使实现这样的事情变得非常麻烦。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-21
      • 2012-11-14
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多