У меня есть система в Scala, с множеством одновременных потоков и системных вызовов. Эта система имеет некоторые проблемы, поскольку использование памяти увеличивается с течением времени.
На следующем рисунке показано использование памяти в течение одного дня. Когда он доходит до предела, процесс завершается, и я кладу сторожевую собаку, чтобы восстановить его снова.
Я периодически запускаю команду
jcmd <pid> GC.run
И это заставляет память медленно увеличиваться, но утечка все еще происходит.
Я проанализировал с помощью jvisualvm, по сравнению с разными моментами времени, с дельтой 40 минут. На рисунке ниже показано сравнение этих двух моментов времени. Обратите внимание, что для экземпляров некоторых классов, таких как ConcurrentHashMap$HashEntry
, SNode
, WeakReference
, char[]
и String
, и для многих классов в пакете scala.collection.concurrent
есть увеличение.
Что может вызвать утечку памяти?
Изменить 1: Исследуя JVisualVM, я заметил объект классов CNode и INode, которые находятся в TriedMap, который встроен в класс sbt.TrapExit $App. Вот цифра иерархии объектов: