繁体   English   中英

Rx.Net 内存泄漏

[英]Rx.Net memory leak

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

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();        
}

实际上没有内存泄漏。

GC.GetTotalAllocatedBytes是在进程的生命周期内分配的字节数。 每次有堆分配时,这个计数器都会上升。

你想要使用的是GC.GetTotalMemory

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

三角洲

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

GC

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM