可以从正在运行的 Erlang/Elixir 系统中删除原子吗?
具体来说,我对如何创建一个应用程序服务器感兴趣,在该服务器中,代表应用程序的模块可以按需加载和运行,然后再删除。
我想这比仅仅删除代表相关模块的原子更复杂,因为它可能定义了更多可能难以或不可能跟踪的原子。
或者,我想知道是否可以单独运行一个模块,以便在不再需要它时可以有效地从正在运行的系统中删除它产生的所有引用。
编辑:只是为了澄清,因为 SO 认为这个问题在其他地方得到了回答,这个问题与原子的垃圾收集无关,而是与手动管理有关。为了进一步澄清,这是我对下面亚历克斯回答的评论:
我还考虑过启动单独的实例(节点?),但这对于按需、每用户应用程序来说非常昂贵。我想要做的是模仿 SAP ABAP 系统的工作方式。一种选择可能是先发制人地运行一定数量的实例,然后在每次请求完成时重新启动它们。(同样,虽然相当昂贵)。另一种可能是监视实例的原子表并在接近限制时重新启动该实例。
我看到运行多个节点/实例的缺点(尽管这是 ABAP 系统所具有的;多个操作系统进程为用户请求提供服务)是您无法在这些实例之间共享缓存的字节码。在 ABAP 系统中,字节码的缓存(他们称之为“加载”)可被不同的进程访问,因此当程序启动时,它在从存储中获取它之前首先检查缓存。
不幸的是,在 VM 关闭之前,VM 中的原子根本不会被销毁。原子限制也跨进程共享,这意味着生成一个新进程来处理原子分配/解除分配在您的情况下不起作用。
通过运行一个单独的 Erlang 应用程序并通过套接字与它通信,您可能会幸运地产生一个完全独立的 VM 实例,尽管我不确定这会有多有效。