Ich habe ein System in Scala, mit vielen simultanen Threads und Systemaufrufen. Dieses System hat ein Problem, da die Speicherbelegung im Laufe der Zeit zunimmt.Speicherleck in Scala und Prozesse
Das folgende Bild zeigt die Speichernutzung für einen Tag. Wenn es ans Limit kommt, schaltet sich der Prozess ab und ich setze einen Wachhund, um ihn wieder zu finden.
Ich betreibe regelmäßig den Befehl
jcmd <pid> GC.run
Und das macht die Erinnerung langsam zu erhöhen, aber das Leck immer noch geschieht.
Ich analysierte mit jvisualvm, im Vergleich zu bestimmten Zeitpunkten, mit 40 Minuten Delta. Das Bild unten zeigt den Vergleich zwischen diesen beiden Zeitpunkten. Beachten Sie, dass es für Instanzen einiger Klassen wie ConcurrentHashMap$HashEntry
, SNode
, WeakReference
, char[]
und String
und viele Klassen im Paket scala.collection.concurrent
eine Erhöhung gibt.
Was den Speicherverlust verursacht werden kann?
Edit 1: jvisualvm Untersuchung, bemerkte ich, Objekt von CNode und INode Klassen, die in TriedMap sind, dass innerhalb sbt.TrapExit $ App Klasse instanziert wird. Hier ist die Objekthierarchie Figur:
http://stackoverflow.com/questions/1218872/avoiding-scala-memory-leaks-scala-constructors?rq=1 http://stackoverflow.com/questions/7944148/weakreference-and-memory-leaks http : //stackoverflow.com/questions/3871960/long-lived-java-weakreferences – Tony
Ich sehe list.toStream.map, aber woher kommen die scala.collection.concurrent? Wenn Sie "viele Threads" sagen, meinen Sie "foo.par" viel? Ich frage nicht als Experte in parallelen Sammlungen. Verwenden Sie explizit eine TrieMap? –
Viele Threads Ich meine, es gibt Hunderte von Akteuren, jeder Akteur führt Systemaufrufe durch und erstellt einige Futures, um Aufgaben asynchron auszuführen. Ich verwende TrieMap nicht explizit. –