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