我在Scala中有一个系统,有很多同时运行的线程和系统调用。这个系统存在一些问题,因为内存使用量随着时间的推移而增加。
下面的图片显示了一天内的内存使用情况。当达到限制时,进程会关闭,然后我会放置一个看门狗来恢复它。
我定期运行以下命令
jcmd <pid> GC.run
这导致内存逐渐增加,但仍然存在泄漏。
我使用jvisualvm进行了分析,对比了两个时间点,时间间隔为40分钟。下面的图片显示了这两个时间点之间的比较。请注意,一些类的实例数量增加了,例如ConcurrentHashMap $ HashEntry
、SNode
、WeakReference
、char []
和String
,以及scala.collection.concurrent
包中的许多类。
是什么导致了内存泄漏?
编辑1: 通过调查JVisualVM,我发现了TriedMap中实例化的CNode和INode类的对象,该类是在sbt.TrapExit $ App类中实例化的。以下是对象层次结构图: