热更新
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版本