C#学习教程:.Net内存在创建大量线程时泄漏分享


.Net内存在创建大量线程时泄漏

我有一个应用程序,随着时间的推移创建了很multithreading。 我注意到内存使用量随着运行而增长,并最终耗尽内存。 但是同样的代码不会泄漏我同事环境中的内存。 我们都有相同的.net版本。 我能够使用以下示例代码重现该问题,该代码不会在我的同事的笔记本电脑上泄漏,而是在我的笔记本电脑上泄漏。

public static void Main(string[] args) { Console.WriteLine("Version " + Environment.Version.ToString()); if (Environment.Is64BitProcess) Console.WriteLine("64"); else Console.WriteLine("32"); while(true) { Thread t = new Thread(() => { Thread.Sleep(1); }); t.IsBackground = true; t.Start(); Thread.Sleep(1); } } 

当我运行上面的内容时,会打印以下内容

 Version 4.0.30319.18063 32 

在Visual Studio 2012中,项目的目标框架是.net framework 4.5。 该项目通过以下配置泄漏内存

 Project Properties -> Build Platform target: Any CPU Prefer 32-bit: checked 

如果我取消选中Prefer 32-bit,它不会泄漏。

泄漏内存的另一种配置是

 Project Properties -> Build Platform target: x86 Prefer 32-bit: disabled 

由此产生的可执行文件在我的笔记本电脑上泄漏,并没有泄漏到我同事的笔记本电脑上。

我使用CLR Profiler来查找内存泄漏,但它没有显示任何泄漏。 但我确实看到Windows资源监视器中的工作集增加了大约1 MB /秒。

是什么导致我的环境中的32位模式的内存使用量增加,而不是我的同事?

我已阅读所有评论,并担心我的评论会丢失,所以尽量回答。

使用专为.NET应用程序设计的内存分析器,JetBrains dotMemory或ANTS或WinDBG或任务管理器或其他本机内存工具。

您可以使用所选探查器的实时图表来比较应用程序在您和您同事的笔记本电脑上的行为方式。 我想你会发现你的笔记本电脑上的内存使用量不断增加 – 只需获取一个内存快照,看看内存中有多少Thread对象,哪些对象占用了大部分内存,并调查它们为什么以及由谁保存在内存中。

您应该同时限制同时运行的线程数,也许可以使用线程池,这样就可以对添加的线程进行排队,并超出您定义的池大小。

https://msdn.microsoft.com/en-us/library/h4732ks0.aspx

上述就是C#学习教程:.Net内存在创建大量线程时泄漏分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—猴子技术宅(www.ssfiction.com)

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/ckf/1031537.html

发表评论

邮箱地址不会被公开。 必填项已用*标注