专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-683-0016      微信咨询  |  联系我们

c# – 如何释放Parallel.Task使用的内存

当前位置:网站建设 > 技术支持
资料来源:网络整理       时间:2023/2/14 0:38:07       共计:3645 浏览
我有一个程序进行内存密集型模拟.下面我写了一个小型控制台应用程序,它复制了我遇到的问题.
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并手动运行垃圾收集器(我知道你不应该这样做).

我确定你的内存没有问题,.NET只是不会缩小已使用的内存,以便将来可以使用它.这为将来的内存分配节省了时间.尝试在完成后重新运行循环,我确定内存不会增长.

所以请试试这个,我会对结果感兴趣!

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正在收集对象并释放内存,但它当前没有释放它,因此可以分配新对象.

版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
·上一条:C# Redis分布式锁的应用 | ·下一条:详解C#中的System.Timers.Timer定时器的使用和定时自动清理内存应用

Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有    粤ICP备16019765号 

广州京杭网络科技有限公司 版权所有