C#如果我使用priority = RealTime运行进程,GC会发生什么?

时间:2010-06-15 14:37:43

标签: .net multithreading garbage-collection

我有一个以优先级RealTime运行的C#应用​​程序。在我过去2天做了一些忙乱的变化之前,一切都很好。现在它在几个小时内耗尽内存。

我试图找出是否是我创建的内存泄漏是因为我消耗了比以前更多的对象而且GC根本无法收集它们,因为它以相同的优先级运行。

我的问题是 - 当尝试使用RealTime优先级在应用程序中收集对象时,GC会发生什么情况(还有至少一个线程以最高线程优先级运行)?

P.S。通过实时优先级我的意思是Process.GetCurrentProcess()。PriorityClass = ProcessPriorityClass.RealTime

抱歉忘了告诉。 GC处于服务器模式

6 个答案:

答案 0 :(得分:12)

GC在您的过程中运行,因此具有相同的优先级。它的收集能力不受运行应用程序的PriorityClass的影响。

这种内存泄漏几乎肯定是由于你抓住一个不断增长的对象图的根来阻止GC收集它。

答案 1 :(得分:2)

很可能GC无法收集它们,因为某处你还有一个参考。 尝试使用内存分析器(RedGate有一个很好的应用程序,尝试试用版)来分析您的应用程序,以找出GC不会收集对象的原因。

答案 2 :(得分:1)

我真的怀疑实时优先级是导致问题的原因。我的猜测是,在你提到的几个变化中,你在某处泄漏了内存(在C#中通常意味着保留对不再需要的对象的引用)。你可以使用内存分析器,将WinDbg与SOS一起使用(参见例如http://msdn.microsoft.com/en-us/magazine/cc163528.aspx),或者只是看看这些变化并尝试解决这个问题。

答案 3 :(得分:1)

我真的不会建议将任何程序作为RealTime优先级运行。基本上,以RealTime优先级运行的任何东西都比GUI,甚至是Windows任务管理器运行的优先级更高......因此可以自己锁定用户。

Raymond Chen talked about this last week

  

特别是,因为甚至没有输入   以实时优先级运行,你不能   通过任何互动方式阻止它,   因为管理输入的线程   甚至无法运行来处理您的输入。

答案 4 :(得分:0)

垃圾收集根据您配置运行的系统类型,线程不同。在一个简单的工作站上,每个单独的线程将托管垃圾收集,但一次只能有一个托管。如果将其配置为在服务器上运行,则单独的线程将承载垃圾收集。

http://msdn.microsoft.com/en-us/library/ee787088.aspx#generations

但也许你的对象停留的时间太长而且进入了Long-Life一代,垃圾收集并不像你想的那样频繁地看着它们。

或许你还有其他一些问题。

答案 5 :(得分:0)

您应该使用内存分析器来识别问题的真正原因,而不是更改线程优先级并可能锁定系统。您还可以使用性能监视器来检查.NET CLR内存类别中的性能计数器,以查看分配了多少内存,垃圾收集存活多少等。