据说原子不是垃圾收集的。一旦你创建了一个原子,它就会保留在原子表中,这可能会在一天结束时导致内存泄漏!Erlang原子如何被垃圾收集
我对Erlang相当陌生,我的问题是:原子如何被垃圾收集?如果不可能,如何尽量减少这种影响?
据说原子不是垃圾收集的。一旦你创建了一个原子,它就会保留在原子表中,这可能会在一天结束时导致内存泄漏!Erlang原子如何被垃圾收集
我对Erlang相当陌生,我的问题是:原子如何被垃圾收集?如果不可能,如何尽量减少这种影响?
原子不是问题,除非你动态创建它们。如果你这样做了,那么你正在通过Erlang系统崩溃。
如何动态创建原子? 例如,在循环内调用list_to_atom函数。
如果您对Erlang垃圾收集感兴趣,请阅读Joe Armstrong的这篇论文:One Pass Real-Time Generational Mark-Sweep Garbage Collection (1995)。
永远记住:不要动态创建原子!
那么有时你可能需要动态创建一个Atom,但不要过度使用它!
尽管我不确定原子是否被垃圾收集,但您可以轻松完成,而无需担心是否会炸毁系统内存。正如@Chiron所说,只要所有的原子在编译时已知就可以了。
如果我确实需要使用list_to_atom/1
怎么办?那么,您可以使用这种功能扭曲的问题:
atom("apple") -> apple;
atom("orange") -> orange;
atom("banana") -> banana.
另外一个解决方法是list_to_existing_atom/1
但是,虚拟机还是可以吃的越来越多的RAM:其他连接Erlang节点可以注册原子全球范围内,这是在运行时分配原子。
感谢您的回答。我的问题是:如果它发生了并且我动态地使用了它们,我怎样才能释放它们的记忆? – securecurve
我可能是错的,但恐怕你实际上不能。 – Chiron
由于不同原子的数量有限,所以内存泄漏的风险非常低。所以你会在你有内存消耗问题之前遇到这个问题(默认最大原子数是'1 048 576') – Pascal