【发布时间】:2017-12-06 00:04:36
【问题描述】:
我的应用程序(用 C# 编写)在过去几个月里还可以,但上周突然开始导致内存泄漏。我没有重建它,二进制文件是一样的!
虽然我试图找出根本原因是什么,但我最终得到了后来在Thread memory leak 中找到的相同测试应用程序。所以我只是简单地复制了 Hans 建议的解决方案,然后启动了它。内存泄漏仍然存在。添加 GC.Collect() 只会导致内存增长变得参差不齐,因为 GC 在每次调用中恢复了一小部分分配的内存。
使用探查器检查,所有其他托管或非托管对象均已正确完成,但与线程相关的对象除外。
class Program
{
static void test()
{
}
static void Main(string[] args)
{
int cnt = 0;
while (true)
{
Thread test_thread = new Thread(() => test());
test_thread.Start();
if (++cnt % 256 == 0) GC.Collect();
Thread.Sleep(20);
}
}
}
然后我在另一台 PC 上尝试了上面相同的测试代码,并且(惊喜!)它运行良好,并且根本没有内存泄漏。
更新:受此主题启发 .Net Memory Leak when creating lots of threads 我试图为不同的目标构建。使用 x64 目标似乎可以解决测试应用程序中的问题。不幸的是,我的真实项目包含无法重建的第 3 方子项目。
看来,我的电脑出了点问题,导致 GC 无法正常工作。你能建议,检查什么,在哪里看?提前致谢。
【问题讨论】:
标签: c# .net multithreading memory-leaks garbage-collection