【发布时间】:2014-11-08 05:00:11
【问题描述】:
我在 Scala 中有一个系统,有很多并发线程和系统调用。这个系统有一些问题,因为内存使用量随着时间的推移而增加。
下图显示了一天的内存使用情况。当它达到极限时,进程关闭,我放了一个看门狗再次恢复它。
我会定期运行命令
jcmd <pid> GC.run
这使得内存增长缓慢,但泄漏仍然发生。
我使用 jvisualvm 进行分析,比较不同的时间点,增量为 40 分钟。下图显示了这两个时刻之间的比较。请注意,ConcurrentHashMap$HashEntry、SNode、WeakReference、char[] 和 String 等某些类的实例以及 scala.collection.concurrent 包中的许多类的实例有所增加。
什么可能导致内存泄漏?
编辑 1: 调查 JVisualVM,我注意到 TriedMap 中的 CNode 和 INode 类的对象,它们在 sbt.TrapExit$App 类中实例化。这是对象层次结构图:
【问题讨论】:
-
我看到 list.toStream.map,但是 scala.collection.concurrent 来自哪里?当您说“很多线程”时,您的意思是“foo.par”很多吗?我不是在问平行收藏方面的专家。您是否明确使用 TrieMap?
-
很多线程我的意思是有数百个参与者,每个参与者都进行系统调用并创建一些未来来异步执行任务。我没有明确使用 TrieMap。
-
你有更新的答案吗?我也有这个类似的问题。希望任何人都可以找出根本原因。提前致谢。
标签: java scala memory memory-leaks