发布:2020/5/11 14:00:19作者:管理员 来源:本站 浏览次数:1278
class Program { static void Main(string[] args) { var t = new Task(() => DoMemoryHog(20000000));
t.Start();
t.Wait();
t.Dispose();
t = null;
GC.Collect();
Console.WriteLine("Done");
Console.ReadLine();
} static void DoMemoryHog(int n) {
ConcurrentBag<double> results = new ConcurrentBag<double>();
Parallel.For(0, n, (i) => {
results.Add(Math.Sqrt(i.GetHashCode()));
});
}
}
当我运行程序时,我可以在Windows任务管理器中看到已用内存量的增加,但是当任务完成(并显示“完成”)时,内存不会恢复到原始级别,只会发生当我关闭应用程序时.
有没有人知道如何释放并行任务使用的内存,而主应用程序一直在运行?正如你所看到的,我已经尝试过处理它,将它的引用设置为null并手动运行垃圾收集器(我知道你不应该这样做).
所以请试试这个,我会对结果感兴趣!
class Program { static void Main(string[] args) {
Process currentProcess = Process.GetCurrentProcess(); for (int i = 0; i < 10; i++) { var t = new Task(() => DoMemoryHog(20000000));
t.Start();
t.Wait();
t.Dispose();
t = null;
GC.Collect();
Console.WriteLine("Done" +i);
Console.WriteLine("Memory: " + GC.GetTotalMemory(false));
Console.WriteLine("Paged: " + currentProcess.PagedMemorySize64);
Console.WriteLine("-------------------------");
}
Console.ReadLine();
} static void DoMemoryHog(int n) {
ConcurrentBag<double> results = new ConcurrentBag<double>();
Parallel.For(0, n, (i) =>
{
results.Add(Math.Sqrt(i.GetHashCode()));
});
}
}
这两种方法用于打印出内存使用情况:
GC.GetTotalMemory(); currentProcess.PagedMemorySize64;
我的输出是:
Done0
Memory: 480080992 Paged: 520753152
------------------------- Done1
Memory: 480081512 Paged: 520753152
------------------------- Done2
Memory: 480082160 Paged: 520753152
------------------------- Done3
Memory: 480083476 Paged: 520753152
------------------------- Done4
Memory: 480083496 Paged: 520753152
------------------------- Done5
Memory: 480083516 Paged: 520753152
------------------------- Done6
Memory: 480083536 Paged: 520753152
------------------------- Done7
Memory: 480084204 Paged: 520753152
------------------------- Done8
Memory: 480084204 Paged: 520753152
------------------------- Done9
Memory: 480085500 Paged: 520753152
-------------------------
据我所知,这里没有记忆问题.对象是清理的,内存可以重复使用.问题解决了吗?
更新
专用字节行为:
正如您所看到的,GC正在收集对象并释放内存,但它当前没有释放它,因此可以分配新对象.
© Copyright 2014 - 2024 柏港建站平台 ejk5.com. 渝ICP备16000791号-4