当前位置: 首页 > 编程语言 > C#

线程内存泄漏共享

时间:2023-04-10 14:12:18 C#

线程内存泄漏我正在尝试追踪产生多个线程的较大C#程序中的内存泄漏。在这个过程中,我创建了一个小方块程序来测试一些基本的东西,我发现了一些我真的不明白的行为。类程序{staticvoidtest(){}staticvoidMain(string[]args){while(true){Threadtest_thread=newThread(()=>test());test_thread.Start();线程睡眠(20);}}}运行这个程序,我看到程序的内存使用量在不停地增加。在短短几分钟内,内存使用量超过了100MB,并且还在继续攀升。如果我注释掉test_thread.Start();行,程序使用的内存可能高达几兆字节并不断升级。我还尝试使用GC.Collect()在while循环结束时强制进行垃圾回收,但它似乎没有做任何事情。我认为一旦函数完成执行允许GC将其拖下,线程将被取消引用,但这似乎并没有发生。我无法深入了解这里的一些事情,如果能帮我解决这个问题,我将不胜感激。提前致谢!这是设计使然,您的测试程序应该显示内存使用失控。您可以从Taskmgr.exe查看根本原因。使用View+SelectColumns并勾选“Handles”。观察进程的句柄数量如何稳步增加。内存使用量相应增加,反映句柄对象使用的非托管内存。一个非常勇敢的设计选择,CLR每个线程使用5个OS对象。管道,用于同步。这些对象本身是一次性的,设计选择不是让Thread类实现IDisposable。这对于.NET程序员来说很难在正确的时间进行Dispose()调用。任务类设计中没有表现出勇气,导致很多人绞尽脑汁,一般建议不要打扰。在设计良好的.NET程序中,这通常不是问题。GC运行得足够频繁以清理这些OS对象。并且Thread对象是谨慎创建的,使用ThreadPool来执行非常短的运行线程,就像测试程序使用的线程一样。没关系,我们看不到你的真实表演。小心不要从如此全面的测试中得出太多结论。您可以使用Perfmon.exe查看GC统计信息,这将使您了解它是否运行得足够频繁。一个体面的.NET内存分析器是首选的武器。GC.Collect()是备用武器。例如:staticvoidMain(string[]args){intcnt=0;while(true){Threadtest_thread=newThread(()=>test());test_thread.Start();如果(++cnt%256==0)GC.Collect();线程.睡眠(20);你会看到它现在来回反弹,永远不会超过4MB。以上就是C#学习教程:线程内存泄漏分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: