我有一个聚合事件的生成服务器:
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表的内存(正如我所认为的(。
问题:
- 这个实现容易发生内存泄漏吗?旧的ets表是垃圾收集的吗
- 附带问题:这个实现看起来很理智吗
当您创建一个没有注册名称的ETS表时(选中选项named_table
(,该表是用引用创建的。不管你创建了多少,旧的仍然存在,所以,是的,如果你不删除旧的,你就会有内存泄漏。
避免这种情况的一种方法是使用named_table
选项。如果上一个表存在,这将崩溃。您可以使用catch
或try-catch块来创建表。