Rx. Net утечка памяти - PullRequest
       8

Rx. Net утечка памяти

0 голосов
/ 19 марта 2020

Интересная утечка памяти. Кто-нибудь знает почему?

foreach (int x in Enumerable.Range(0, 1_000_000)
    .Select(async i => i))
{
}

GC.Collect();
Console.WriteLine(GC.GetTotalAllocatedBytes()); // 1036542160

foreach (int x in Enumerable.Range(0, 1_000_000)
    .Select(async i => i))
{
}

GC.Collect();
Console.WriteLine(GC.GetTotalAllocatedBytes()); // 2072860704

foreach (int x in Enumerable.Range(0, 1_000_000)
    .Select(async i => i))
{
}

GC.Collect();
Console.WriteLine(GC.GetTotalAllocatedBytes()); // 3109160008

Где:

static class SelectAsync
{
    public static IEnumerable<TResult> Select<T, TResult>(
        this IEnumerable<T> source, Func<T, Task<TResult>> selector) =>
        source
            .ToObservable()
            .Select(value => Observable.FromAsync(() => selector(value)))
            .Concat()
            .ToEnumerable();        
}

1 Ответ

3 голосов
/ 19 марта 2020

На самом деле утечки памяти нет.

GC.GetTotalAllocatedBytes - это число байтов, выделенных за время существования процесса. Каждый раз, когда выделяется куча, этот счетчик увеличивается.

Вместо этого вы хотите использовать GC.GetTotalMemory.

Если вы увидите дельты между значениями тестов, вы увидите, что они примерно одинаковы.

deltas

Вы увидите небольшие изменения в своих тестах, связанные с давлением памяти.

gc

...