同名重新创建ets表会释放内存吗?

问题描述 投票:0回答:1

我有聚合事件的genserver:

  def init(opts) do
    cache = :ets.new(:events_cache, [:set])
    {:ok, cache}
  end

  def handle_info(:autoflush, cache) do
    Logger.debug(fn -> "#{:ets.info(cache)[:size]} events was aggregated. Sending to transport..." end)
    Events.emit(:ets.tab2list(cache))
    Process.send_after(self(), :autoflush, @flush_after)
    {:noreply, :ets.new(:events_cache, [:set])}
  end

  def handle_cast({:add_event, event}, cache) do
    :ets.insert(cache, {event})
    {:noreply, cache}
  end

init
中,我创建了ets表。在
cast
中添加值,并在
info
中将数据刷新到外部调用,清理 ets 表的内存(正如我所想)。

问题:

  1. 这个实现容易出现内存泄漏吗?旧的 ets 表会被垃圾收集吗?
  2. 旁白问题:这个实现看起来是否正常?
memory-leaks elixir worker erlang-otp ets
1个回答
2
投票

编辑(2024年7月18日)只是回答问题,如果内存被收集,我认为应该是因为ETS表链接到进程,如果该进程终止,则必须删除ETS表。

提供一个正确的名称,如果您不相信正确清理 ETS,则可以使用该名称,但如果创建了多个服务器(未命名服务器),则这不是一个有效的选项。

© www.soinside.com 2019 - 2024. All rights reserved.