Erlang原子如何被垃圾收集

sec*_*rve 5 erlang garbage-collection

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

我对Erlang很新,我的问题是:原子如何被垃圾收集?如果不可能,如何最大限度地减少这种影响?

Chi*_*ron 12

除非您动态创建原子,否则原子不会出现问题.如果你这样做了,那么你正在试图让Erlang系统崩溃.

如何动态创建Atoms?例如,在循环内调用list_to_atom函数.

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

始终牢记:不要动态创建原子!
好吧有时你可能需要动态创建一个Atom但不要过度使用它!

  • 我可能错了,但我担心你实际上不能. (3认同)

fen*_*llp 5

虽然我不确定原子是垃圾收集的,但您可以轻松地做到,而不必担心是否会炸毁系统的内存.正如@Chiron所说,只要你的所有原子在编译时都知道,你应该没问题.

如果我真的需要以list_to_atom/1某种方式使用该怎么办?好吧,您可以使用这种功能扭转您的问题:

atom("apple") -> apple;
atom("orange") -> orange;
atom("banana") -> banana.
Run Code Online (Sandbox Code Playgroud)

另一种解决方法是 list_to_existing_atom/1

但VM仍然可以占用越来越多的RAM:其他连接的Erlang节点可以全局注册原子,即在运行时分配原子.