据说原子不是垃圾收集的。一旦你创建了一个原子,它就会保留在原子表中,这可能会在一天结束时导致内存泄漏!
我对Erlang很新,我的问题是:原子如何被垃圾收集?如果不可能,如何最大限度地减少这种影响?
答案 0 :(得分:12)
除非您动态创建原子,否则原子不会出现问题。如果你这样做了,那么你正在试图让Erlang系统崩溃。
如何动态创建Atoms? 例如,在循环内调用 list_to_atom 函数。
如果您对Erlang垃圾收集感兴趣,请阅读Joe Armstrong撰写的这篇论文:One Pass Real-Time Generational Mark-Sweep Garbage Collection (1995)。
始终牢记: 不要动态创建原子!
好吧,有时你可能需要动态创建一个Atom,但不要过度使用它!
答案 1 :(得分:5)
虽然我不确定原子是垃圾收集的,但您可以轻松地做到,而不必担心是否会炸毁系统的内存。正如@Chiron所说,只要你的所有原子在编译时都知道,你应该没问题。
如果我真的需要以某种方式使用list_to_atom/1
怎么办?好吧,您可以使用这种功能扭转您的问题:
atom("apple") -> apple;
atom("orange") -> orange;
atom("banana") -> banana.
另一种解决方法是list_to_existing_atom/1
但VM仍然可以占用越来越多的RAM:其他连接的Erlang节点可以全局注册原子,即在运行时分配原子。
答案 2 :(得分:-1)
原子真的很好,也是发送消息或表示常量的好方法。但是,使用原子做太多事情有一个陷阱:在“原子表”中引用原子会消耗内存(在32位系统中为4字节/原子,在64位系统中为8字节/原子)。原子表不是垃圾收集的,因此原子将一直累积,直到系统由于内存使用或声明了1048577个原子而终止。
这意味着无论出于何种原因都不应该动态生成原子;如果您的系统必须可靠,并且用户输入让某人通过创建原子来让它随意崩溃,那么您将面临严重的麻烦。坦白地说,应将原子视为开发人员的工具。