ets表在用相同的名称重新创建后会释放内存吗



我有一个聚合事件的生成服务器:

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. 附带问题:这个实现看起来很理智吗

当您创建一个没有注册名称的ETS表时(选中选项named_table(,该表是用引用创建的。不管你创建了多少,旧的仍然存在,所以,是的,如果你不删除旧的,你就会有内存泄漏。

避免这种情况的一种方法是使用named_table选项。如果上一个表存在,这将崩溃。您可以使用catch或try-catch块来创建表。

相关内容

  • 没有找到相关文章

最新更新