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