根据Erlang文档,代码加载,Erlang只维护一个模块的两个版本,当前版本和旧版本。
为什么它不将多个版本的旧代码保存在代码重新加载中,并且不扼杀在旧代码中挥之不去的进程。
发布于 2018-03-01 11:54:03
这是一种保守的方法,它保证在对模块进行2次升级之后,您可以确定没有任何进程仍在执行该代码的旧版本。这意味着您知道旧的bug或漏洞已被清除,并且没有代码仍然期望旧的数据格式(内存或磁盘中)或在进程之间发送/接收旧形式的消息。
最初,2版本实现的动机可能是需要能够让节点在不重新启动的情况下运行很长时间,并且与现在的系统相比,在RAM相对较少的硬件上运行,所以代码升级不应该以无法删除的旧模块版本的形式泄漏内存,因为某些进程的调用堆栈仍在引用它。虽然这仍然值得关注,但我想说的是,我上面列出的原因是这些天来的主要原因。
因此,虽然这是一个实现细节,而且您可以拥有一个Erlang实现,它允许任意数量的版本在运行中,使用的是未使用代码的自动垃圾收集,但是运行生产系统的人似乎从未想过这样做。它只会给运行系统的状态增加一个更大的不确定性窗口。2版本的实现提供了一种在不停止系统的情况下发展系统的干净方式。
https://stackoverflow.com/questions/49045122
复制相似问题