热更新

Erlang的Code模块是Erlang code server暴露的对外接口,职责是把已编译的模块加载的Erlang运行环境。

两种模式

  • embedded

    显示指定加载模块顺序,一般再启动脚本指定或启动之后调用code模块函数加载模块。

  • interactive (默认)

    系统启动时只会加载运行需要的模块,其他在第一次调用时动态加载。

    此模式的code server维护了一个搜索代码的路径列表,可用code模块中函数管理。

    为了保证code server稳定可靠,kernel、stdlib、compiler被标记为sticky,不允许重新加载。code模块中也有函数管理sticky。

版本切换

Erlang 代码在运行中最多只有两个版本,current 和 old,新加载的代码都是current版本,上一次加载的代码是old版本。old版本的存在是保证在新加载代码时,之前未执行结束的调用能正常执行。

但是如果old和current版本同时存在,并且old版本调用未结束,这时又再次加载了新的代码,系统就会直接终止old版本进程,将current版本置为old版本,新加载的代码作为current。

purge(Modile)函数可以终止old版本进程并清理old版本,soft_purge函数则只清理没有调用的old版本