Memory leaks GenServer进程内存泄漏

Memory leaks GenServer进程内存泄漏,memory-leaks,garbage-collection,elixir,gen-server,Memory Leaks,Garbage Collection,Elixir,Gen Server,我最近遇到了一点小麻烦:GenServer进程使用的内存非常高,可能是因为大量的二进制泄漏 问题就出在这里:我们通过GenServer接收大型二进制文件,然后将它们传递给消费者,消费者随后与该数据交互。现在,这些大型二进制文件从未分配给变量,GC也不会对它们进行检查 在管理数据之后,我尝试过休眠进程,这部分是有效的,因为进程使用的内存降低了很多,但是由于二进制文件没有得到GC'd,它们使用的内存量缓慢但稳定地增加,从没有休眠的30 MB增加到大约25分钟内进程休眠的200 MB 我还尝试设置了:

我最近遇到了一点小麻烦:GenServer进程使用的内存非常高,可能是因为大量的二进制泄漏

问题就出在这里:我们通过GenServer接收大型二进制文件,然后将它们传递给消费者,消费者随后与该数据交互。现在,这些大型二进制文件从未分配给变量,GC也不会对它们进行检查

在管理数据之后,我尝试过休眠进程,这部分是有效的,因为进程使用的内存降低了很多,但是由于二进制文件没有得到GC'd,它们使用的内存量缓慢但稳定地增加,从没有休眠的30 MB增加到大约25分钟内进程休眠的200 MB

我还尝试设置了
:erlang.system\u标志(:fullsweep\u after,0)
,这也有效地降低了进程使用的内存约20%

和。 我必须说,进程有时会使用60-70MB的内存

编辑:使用:侦察箱泄漏(15)释放--of:侦察箱泄漏(15)

无论如何,使用的内存仍然很高,我完全相信它可以被修复

您在“流程”选项卡中有一个从观察者处截取的屏幕截图。正如您所看到的,GenServer是一个像饼干怪物一样吃掉内存的服务器

关于这个话题,我做了很多研究,尝试了所有的建议和可能的解决方案,尽管如此,我仍然处于这个位置

欢迎任何帮助

密码在里面

这可能是造成这个+。4个流程中有3个(,正在使用


感谢您的阅读。

您可以尝试将
:hibernate
原子添加到您的
处理\u事件
GenStage相关模块中的返回值。例如:

def handle_events(events, _from, %{handler: handler, public: public} = state) do
  public = handle(handler, events, public)
  {:noreply, [], %{state | public: public}, :hibernate}
end
另一个选项是在
:recon.bin_leak()
之后记录PID,然后将其传递给
Process.info(PID)
,以获取有关违规GenServer的更多信息

一些额外资源:


(特别是关于内存泄漏的第7章)

只是看看这个,但这有点代码味道:你能找出泄漏的来源吗?也许是执行所有功能的时候?很难诊断整个管道,但对我来说,它似乎来自生产者消费者。你有没有尝试用
:binary.copy/1
复制消息?我有可以看出,减少创建的中间层的数量会大大降低内存使用率。关于使用
:binary.copy/1
复制消息,我将如何在我的情况下应用它?非常简单,我在中添加了一个
缓冲区大小
,从而稍微降低了内存使用量。