2013-12-11 91 views
5

据说原子不是垃圾收集的。一旦你创建了一个原子,它就会保留在原子表中,这可能会在一天结束时导致内存泄漏!Erlang原子如何被垃圾收集

我对Erlang相当陌生,我的问题是:原子如何被垃圾收集?如果不可能,如何尽量减少这种影响?

回答

10

原子不是问题,除非你动态创建它们。如果你这样做了,那么你正在通过Erlang系统崩溃。

如何动态创建原子? 例如,在循环内调用list_to_atom函数。

如果您对Erlang垃圾收集感兴趣,请阅读Joe Armstrong的这篇论文:One Pass Real-Time Generational Mark-Sweep Garbage Collection (1995)

永远记住:不要动态创建原子!
那么有时你可能需要动态创建一个Atom,但不要过度使用它!

+0

感谢您的回答。我的问题是:如果它发生了并且我动态地使用了它们,我怎样才能释放它们的记忆? – securecurve

+3

我可能是错的,但恐怕你实际上不能。 – Chiron

+1

由于不同原子的数量有限,所以内存泄漏的风险非常低。所以你会在你有内存消耗问题之前遇到这个问题(默认最大原子数是'1 048 576') – Pascal

4

尽管我不确定原子是否被垃圾收集,但您可以轻松完成,而无需担心是否会炸毁系统内存。正如@Chiron所说,只要所有的原子在编译时已知就可以了。

如果我确实需要使用list_to_atom/1怎么办?那么,您可以使用这种功能扭曲的问题:

atom("apple") -> apple; 
atom("orange") -> orange; 
atom("banana") -> banana. 

另外一个解决方法是list_to_existing_atom/1

但是,虚拟机还是可以吃的越来越多的RAM:其他连接Erlang节点可以注册原子全球范围内,这是在运行时分配原子。