首页 > 解决方案 > 为什么垃圾收集器不释放内存

问题描述

我有一个添加类型“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#listmemorygarbage-collection

解决方案


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


推荐阅读