【问题标题】:Why the garbage collector does not free memory为什么垃圾收集器不释放内存
【发布时间】:2020-04-08 13:07:59
【问题描述】:

我有一个添加“IJornalEnrty”类型元素的列表。并且有一个任务是慢慢读取列表。由于列表是共享资源,因此通过锁访问它。列表项必须写入数据库表,并且为了不长时间阻塞,复制内存并将该项从列表中删除。 由于读取列表的任务,内存不断增长,即使列表完全为空,内存也不会被清除。

public interface IJornalEnrty
{
    string device { get; set; }
    string action { get; set; }
    string date { get; set; }
    IJornalEnrty Clone();
}
public struct JornalEnrty : IJornalEnrty
{
    public string device { get; set; }
    public string action { get; set; }
    public string date { get; set; }
    public JornalEnrty(params string[] p)
    {
        device = p[0];
        action = p[1];
        date = p[2];
    }
    public IJornalEnrty Clone ()
    {
        return new JornalEnrty(String.Copy(device), String.Copy(action), String.Copy(date));
    }
}
static async void InsertEntryAsync(object o)
    {
        CancellationToken cancel = (CancellationToken)o;
        string sql = "";
        while (!cancel.IsCancellationRequested)
        {
            IJornalEnrty entry = null;
            await GetEntryListLoker.WaitAsync();
            entry = EntryList[0]?.Clone();
            EntryList.RemoveAt(0);
            GetEntryListLoker.Release();
            await SaveEntry(entry);
        }
    }

【问题讨论】:

  • 垃圾收集器是不确定的。它不像 C++ 析构函数。内存不会在不再使用的那一刻被简单地释放。您可以使用GC.Collect 强制收集,但我建议不要这样做。

标签: c# list memory garbage-collection


【解决方案1】:

因为 GC 只在需要且存在内存压力时运行。时期。您的调试器应该有一个内存配置文件视图,显示每个 GC 层何时收集,您可能会看到它根本不需要运行。

【讨论】:

  • 我已经认为实现IDisposable 对我的IJornalEnrty 是必要的。
  • IDisposable 不清理托管内存。它允许一个类摆脱非托管资源,即文件句柄等 - 需要在某个时间点关闭。它不会处理任何托管内存。更多关于基础知识的阅读;)
猜你喜欢
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多