2013-12-11 16 views
5

Si dice che gli atomi non sono spazzatura. Una volta creato un atomo, rimane nella tabella atom, che potrebbe causare perdite di memoria alla fine della giornata!Come gli atomi di Erlang possono essere raccolti dalla spazzatura

Sono abbastanza nuovo per Erlang, e la mia domanda è: come gli atomi possono essere garbage collection? E se non è possibile, come minimizzare questo effetto?

risposta

10

gli atomi non sono problema a meno che si sta creando in modo dinamico. Se l'hai fatto, allora sei sulla buona strada per mandare in crash un sistema Erlang.

Come creare gli atomi in modo dinamico? Ad esempio chiamando la funzione list_to_atom all'interno di un ciclo.

Se siete interessati a garbage collection Erlang, quindi leggere questo scritto da Joe Armstrong: One Pass Real-Time Generational Mark-Sweep Garbage Collection (1995).

Ricorda sempre: Non creare gli atomi in modo dinamico!
Beh a volte potrebbe essere necessario creare un Atom dinamicamente ma non più di usarlo!

+0

Grazie per la risposta. La mia domanda è: se è successo e li ho usati in modo dinamico, come posso liberare la memoria di loro? – securecurve

+3

Potrei sbagliarmi, ma temo che non sia possibile. – Chiron

+1

Hai pochissimi rischi di perdita di memoria, perché il numero di atomi diversi è limitato. Quindi colpirai questo problema prima di avere problemi di consumo di memoria (di default il numero massimo di atomi è '1 048 576') – Pascal

4

Mentre io non sono sicuro atomi sono garbage collection sono, si può facilmente fare a meno di preoccuparsi se si saltare in aria memoria del sistema. Come ha detto @Chiron, finché tutti i tuoi atomi sono noti al momento della compilazione, dovresti essere ok.

Che cosa succede se ho veramente bisogno di usare list_to_atom/1 in qualche modo? Beh, si può essere in grado di ruotare il problema utilizzando questo tipo di funzione:

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

Un'altra soluzione è list_to_existing_atom/1

Ma la VM può ancora mangiare di più e più RAM: altri nodi Erlang collegati possono registrare atomi a livello globale, questo è allocare gli atomi in fase di esecuzione.