Почему сборщик мусора не освобождает память - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть список, к которому добавляются элементы типа "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);
        }
    }

1 Ответ

2 голосов
/ 08 апреля 2020

Поскольку G C запускается только тогда, когда это необходимо, и существует нехватка памяти. Период. Ваш отладчик должен иметь представление профиля памяти, показывающее, когда собирается каждый из уровней G C, и вы, вероятно, увидите, что он просто не чувствует необходимости в его запуске.

...