2010-06-15 102 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

相關問題