2010-06-15 101 views
8

我有一个C#应用程序,它的优先级为RealTime。这一切都很好,直到我在过去2天内没有做出任何紧张的改变。现在它在几个小时内耗尽内存。C#如果我使用priority = RealTime运行进程,GC会发生什么情况?

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

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

附注:通过实时优先级我的意思是Process.GetCurrentProcess()的priorityClass = ProcessPriorityClass.RealTime

对不起忘了告诉。 GC处于服务器模式

+0

这与C#有什么关系? – 2010-06-15 19:14:37

+0

我在C#上做了它,我只知道C#。如果有人会用VB.NET或CLR或真空领域的抽象可编程接口来回答我不理解......为什么? – 2010-06-15 19:20:57

回答

12

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

这种内存泄漏几乎可以肯定是由于您持有不断增长的对象图的根,这会阻止GC收集它。

+0

是的,谢谢。我只是意识到这是愚蠢的问题,像往常一样:)当然如何GC线程可以在应用程序域外运行,并以不同优先级运行:) Crazy :) – 2010-06-15 19:05:50

2

很可能GC无法收集它们,因为某处您仍然有一个引用。 尝试使用内存分析器(RedGate有一个很好的应用程序,您应该尝试试用版)来分析您的应用程序,找出为什么GC不会收集您的对象。

+0

你确定优先顺序不是问题吗?在同意它的优点之前,我使用了RedGate。但可能需要一些时间。 – 2010-06-15 14:49:12

1

我真的怀疑真正的时间优先是你的问题的原因。我的猜测是,在你提到的一些变化中,你会在某处泄漏内存(在C#中通常意味着保留对不再需要的对象的引用)。您可以使用内存分析器,在SOS中使用WinDbg(请参阅,例如http://msdn.microsoft.com/en-us/magazine/cc163528.aspx),或者查看这些更改并尝试着眼于此问题。

0

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

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

但是,也许你的对象是住周围过长和获得长寿命发电和垃圾回收是不是他们往往你想寻找。

或者您可能还有其他问题。

+0

>在一个简单的工作站上,每个单独的线程将托管垃圾收集[...] 您的链接总结不准确。 GC可能在_any_单个用户线程上运行,但每次只能运行一个;在服务器垃圾收集上,运行多个单独的线程。 – Blaisorblade 2010-06-16 18:46:08

1

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

Raymond Chen talked about this last week

特别,因为即使不输入的实时优先级运行 ,你不能 通过任何交互手段阻止它,因为 管理输入 甚至不能运行处理您的输入线。

+0

该文章的评论中还有一个有用的警告:如果您坚持让您的应用程序实时优先运行,那么您应该在应用程序失去焦点时检测应用程序,并在此情况下放弃其优先级。否则,用户可能难以将焦点返回给应用程序,因此将被迫重新启动其机器或等到应用程序停止使用CPU(可能永远不会发生)。 – Brian 2010-06-15 15:41:46

+0

这是纯粹的服务器应用程序,应该是软实时的。 – 2010-06-15 19:00:37

0

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

+0

是的,我确定了它。 3D派对API的规模增长;) – 2010-06-15 19:12:00

相关问题