我在Scala中有一个系统,有很多同时进行的线程和系统调用。这个系统有一些问题,因为内存使用量会随着时间的推移而增加。
下图显示了一天的内存使用情况。当它达到极限时,过程关闭,我放一只看门狗再次恢复它。
我定期运行命令
jcmd <pid> GC.run
这会使记忆缓慢增加,但泄漏仍然会发生。
我用jvisualvm进行了分析,比较了不同时刻,40分钟三角洲。下图显示了这两个时刻之间的比较。请注意,某些类的实例有所增加,例如ConcurrentHashMap$HashEntry
,SNode
,WeakReference
,char[]
和String
以及包中的许多类{{1 }}
什么可能导致内存泄漏?
修改1 : 调查JVisualVM,我注意到了TrodeMap中的CNode和INode类的对象,它在sbt.TrapExit $ App类中实例化。这是对象层次结构图:
答案 0 :(得分:1)
当应用程序因内存不足问题而崩溃时,首先捕获堆转储。启动jvm时添加以下标志
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump
接下来,您需要分析堆转储以找出内存泄漏的来源。我建议使用Eclipse MAT。 Leak Suspects报告应该可以让您了解实际导致泄漏的对象。
答案 1 :(得分:0)
没有看到实施很难说。您的帖子标题表明Scala中存在内存泄漏,但您是否检查了您的实现以解决发布对象的问题?
您是否检查了以下内容:
我想说的可能是你内存不足,因为你只是创建了许多以后不会被释放的对象,因为他们仍在执行他们的任务(没有超时)或者你创建了他们中的很多人。
也许您需要将应用程序扩展到许多jvms?你使用了多少个jvms?