Rx.Net内存泄漏

问题描述 投票:0回答:1

一个有趣的内存泄漏。有人知道为什么吗?

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();        
}
c# linq system.reactive
1个回答
1
投票

实际上没有内存泄漏。

GC.GetTotalAllocatedBytes是在进程的生存期内分配的字节数。每当有堆分配时,此计数器就会增加。

您想使用的是GC.GetTotalMemory

如果您看到测试值之间的差异,则会发现它们大致相同。

deltas

您会在测试中看到一些与内存压力有关的细微变化。

gc

© www.soinside.com 2019 - 2024. All rights reserved.