【问题标题】:Erlang Hot Code LoadingErlang 热代码加载
【发布时间】:2018-08-09 06:02:10
【问题描述】:

根据 Erlang 文档Code Loading,Erlang 只维护一个模块的 2 个版本,当前版本和旧版本。
为什么它不会在代码重新加载时保留旧代码的多个版本,并且不会杀死在旧代码中挥之不去的进程。

【问题讨论】:

  • 我似乎记得 erlang-questions 邮件列表上的一个帖子说这只是一个实现细节,原则上没有理由为什么 VM 不应该保留超过 2 个版本 -但我现在找不到该消息...

标签: erlang


【解决方案1】:

这是一种保守的方法,可保证在模块升级 2 次后,您可以确定没有任何进程仍在执行该代码的旧版本。这意味着您知道旧的错误或漏洞已被清除,并且没有代码仍然需要旧的数据格式(在内存或磁盘上)或在进程之间发送/接收旧形式的消息。

最初,实现 2 版本的动机可能是需要能够保持节点运行很长时间而无需重新启动,并且与当今的系统相比,在 RAM 相对较少的硬件上,因此代码升级不应该由于某些进程的调用堆栈仍在引用它,因此可能会以无法删除的旧模块版本的形式泄漏内存。虽然这仍然令人担忧,但我想说我上面列出的原因是这些天的主要原因。

因此,虽然它是一个实现细节,并且您可以拥有一个允许运行任意数量版本的 Erlang 实现,并自动对未使用的代码进行垃圾收集,但运行生产系统的人似乎从未想要这个。它只会给正在运行的系统状态增加一个更大的不确定性窗口。 2 版本的实现提供了一种无需停止即可发展系统的简洁方式。

【讨论】:

    猜你喜欢
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多