一个有趣的内存泄漏。有人知道为什么吗?
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();
}发布于 2020-03-20 01:59:22
实际上没有内存泄漏。
GC.GetTotalAllocatedBytes是在进程的生命周期内分配的字节数。每次有堆分配时,这个计数器就会上升。
您想要使用的是GC.GetTotalMemory。
如果您看到测试值之间的差值,您将看到它们大致相同。

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

https://stackoverflow.com/questions/60762407
复制相似问题