Erlang热门代码加载

Chi*_*ain 5 erlang

根据Erlang文档,代码加载,Erlang只维护2个版本的模块,当前和旧版本.
为什么它不会在代码重新加载时保留多个版本的旧代码,并且不会终止在旧代码中延迟的进程.

Ric*_*rdC 4

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

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

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