2013-12-11 86 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節點可以註冊原子全球範圍內,這是在運行時分配原子。