Scala和进程中的内存泄漏

Dan*_*ier 13 java memory memory-leaks scala

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

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

我定期运行命令

jcmd <pid> GC.run
Run Code Online (Sandbox Code Playgroud)

这使得内存缓慢增加,但泄漏仍然发生.

我用jvisualvm进行了分析,比较了不同时刻,40分钟三角洲.下图显示了这两个时刻之间的比较.请注意,有一个增加一些像类的实例ConcurrentHashMap$HashEntry,SNode,WeakReference,char[]String许多类的包装scala.collection.concurrent.

记忆漏出的对象

什么可能导致内存泄漏?

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

对象层次

rre*_*evo 3

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

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump
Run Code Online (Sandbox Code Playgroud)

接下来,您需要分析堆转储以找出内存泄漏的根源。我建议使用Eclipse MAT。泄漏嫌疑人报告应该让您了解哪些对象实际上导致了泄漏。