Mein Projekt hat die maximal 1M Atome durchgebrannt, wir haben die Grenze überschritten, aber ich muss den Code, den Leute bezüglich list_to_atom und ihren Freunden einreichen, vernünftig anwenden. Ich möchte damit beginnen, eine Liste aller registrierten Atome zu bekommen, damit ich sehen kann, wo die größten Täter sind. Gibt es einen Weg dies zu tun? Ich muss kreativ sein, wie ich es mache, also versuche ich nicht, 1-2M Zeilen in einer Live-Konsole auszugeben.
Danke.
Ich bin nicht sicher, ob es eine Möglichkeit gibt, es auf einem Live-System zu tun, aber wenn Sie es in einer Testumgebung ausführen können, sollten Sie in der Lage sein, eine Liste über Crash-Dump zu bekommen. Die Atomtabelle befindet sich nahe am Ende des Crash-Dump-Formats . Sie können einen Crash-Dump über erlang: halt / 1 erstellen, aber das wird das ganze herunterbringen Laufzeitsystem.
Sie können alle Atome erhalten, indem Sie eine nicht dokumentierte Funktion des externen Termformats verwenden.
Ein Erlang-Ausdruck, der im externen Ausdruckformat codiert ist, beginnt mit dem Byte 131, dann einem Byte, das den Typ identifiziert, und dann mit den tatsächlichen Daten. Ich fand, dass EEP-43 alle möglichen Typen erwähnt, einschließlich ATOM_INTERNAL_REF3
mit Typ Byte 75, die wird nicht in der offiziellen Dokumentation des externen Termformats erwähnt.
Für ATOM_INTERNAL_REF3
sind die Daten ein Index in die Atomtabelle, kodiert als eine 24-Bit-Ganzzahl. Wir können einfach eine solche Binärdatei erstellen: <<131,75,N:24>>
Zum Beispiel scheint false
in meiner Erlang-VM das nullte Atom in der Atom-Tabelle zu sein:
Es gibt keine einfache Möglichkeit, die Anzahl der Atome in der Atomtabelle * zu finden, aber wir können die Zahl weiter erhöhen, bis wir einen badarg
-Fehler bekommen.
Also dieses kleine Modul gibt Ihnen eine Liste aller Atome:
%Vor%Die Ausgabe sieht folgendermaßen aus:
%Vor% * In Erlang / OTP 20.0 können Sie erlang:system_info(atom_count)
:
Ich wage zu sagen, dass wenn Sie mehr als 1M Atome verwenden, dann machen Sie etwas falsch. Atome sollen statisch sein, sobald die Anwendung läuft oder zumindest oben durch eine kleine Zahl begrenzt ist, etwa 3000 für eine mittelgroße Anwendung.
Sei sehr vorsichtig, wenn ein Feind Atome in deiner VM erzeugen kann. besonders Anrufe wie list_to_atom / 1 sind etwas gefährlich.
EDITED (falsche Antwort ..)
Sie können die Anzahl der Atome mit +t
.. aber ich kenne sehr wenige Anwendungsfälle, wenn es notwendig ist.
Sie können Atomstatistiken mit erlang:memory()
Tags und Links erlang