Scala和进程中的内存泄漏

时间:2014-09-14 15:37:59

标签: java scala memory memory-leaks

我在Scala中有一个系统,有很多同时进行的线程和系统调用。这个系统有一些问题,因为内存使用量会随着时间的推移而增加。

下图显示了一天的内存使用情况。当它达到极限时,过程关闭,我放一只看门狗再次恢复它。 inserir a descrição da imagem aqui

我定期运行命令

jcmd <pid> GC.run

这会使记忆缓慢增加,但泄漏仍然会发生。

我用jvisualvm进行了分析,比较了不同时刻,40分钟三角洲。下图显示了这两个时刻之间的比较。请注意,某些类的实例有所增加,例如ConcurrentHashMap$HashEntrySNodeWeakReferencechar[]String以及包中的许多类{{1 }}

memory leaked ojects

什么可能导致内存泄漏?

修改1 : 调查JVisualVM,我注意到了TrodeMap中的CNode和INode类的对象,它在sbt.TrapExit $ App类中实例化。这是对象层次结构图:

object hierarchy

2 个答案:

答案 0 :(得分:1)

当应用程序因内存不足问题而崩溃时,首先捕获堆转储。启动jvm时添加以下标志

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump

接下来,您需要分析堆转储以找出内存泄漏的来源。我建议使用Eclipse MATLeak Suspects报告应该可以让您了解实际导致泄漏的对象。

答案 1 :(得分:0)

没有看到实施很难说。您的帖子标题表明Scala中存在内存泄漏,但您是否检查了您的实现以解决发布对象的问题?

您是否检查了以下内容:

  • 你是否限制演员人数?
  • 您是否为系统调用设置了超时?
  • 你是否允许演员在执行任务时从Heap中删除?
  • 你有没有算过有多少演员可以融入你的记忆中,或者你只是在创造出数百名演员&#34;希望jvm知道&#34;做什么&#34;

我想说的可能是你内存不足,因为你只是创建了许多以后不会被释放的对象,因为他们仍在执行他们的任务(没有超时)或者你创建了他们中的很多人。

也许您需要将应用程序扩展到许多jvms?你使用了多少个jvms?