Erlang热门代码加载

时间:2018-03-01 08:02:00

标签: erlang

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

1 个答案:

答案 0 :(得分:4)

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

最初,2版本的实现可能是因为需要能够在没有重新启动的情况下保持节点运行很长时间,并且在与当今系统相比具有相对较少RAM的硬件上,因此代码升级不应该以旧模块版本的形式泄露内存的风险,由于某些进程的调用堆栈仍在引用它,因此无法删除。虽然这仍然值得关注,但我会说上面列出的原因是最近的原因。

因此,虽然它是一个实现细节,并且您可以拥有允许任意数量的版本在飞行中的Erlang实现,并且对未使用的代码进行自动垃圾收集,但是运行生产系统的任何人似乎都不希望这样。它只会为运行系统的状态增加一个更大的不确定窗口。 2版本的实现提供了一种在不停止的情况下发展系统的简洁方法。