2013-12-11 8 views
5

原子はガベージコレクションされていないと言われています。アトムが作成されると、アトムテーブルに残ります。そのため、1日の終わりにメモリリークが発生する可能性があります。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

である。しかし、VMはまだより多くのRAMを食べることができます。他には、Erlangのノードが原子を登録することが接続されています実行時にアトムを割り当てます。

関連する問題