我們有一個.net c#服務,當它在咀嚼越來越多的內存時。它有一個'Service'派生類,它基本上創建了其他對象,這些對象封裝了服務旨在支持的各個功能。我在想,也許我正在創建一個對象,並且由於編程錯誤而沒有收集垃圾。如何解決爲什麼我的.net服務咀嚼內存?
任何人都知道最好的方式來找出發生了什麼事情,而不設置斷點?
我們有一個.net c#服務,當它在咀嚼越來越多的內存時。它有一個'Service'派生類,它基本上創建了其他對象,這些對象封裝了服務旨在支持的各個功能。我在想,也許我正在創建一個對象,並且由於編程錯誤而沒有收集垃圾。如何解決爲什麼我的.net服務咀嚼內存?
任何人都知道最好的方式來找出發生了什麼事情,而不設置斷點?
您可以使用內存分析器像memprofiler,ants profiler,而這個問題也可以幫助What Are Some Good .NET Profilers?
他們給你的對象好好看看被創建,代他們在,他們正在使用的內存等。大多數情況下,您可以使用探查器縮小問題範圍。
最好的方法是運行Visual Studio中的Performance Profiler。它允許你看到你的對象的生命週期。
創建文本日誌並記錄發生的所有事情並從那裏開始工作。特別是對於服務來說,這是找出可能出錯的最簡單方法。只需打印出事件,對象及其屬性的狀態。
也許你可以找到某種方式。
祝你好運
您需要使用內存分析器,看看哪些對象導致內存泄漏。我用這一個這樣的病例:http://www.jetbrains.com/profiler/
打開任務管理器,看內存
包裹在一個類中的每個主要部分的執行(這裏我用一個BLL)
然後從BLL
調用然後嘗試包裹每個頂層片中using語句一次一個
using (TheBll bll = new TheBll)
{
bll.ProcessStuff();
}
這使得代碼完成後最everythign解除分配,使得更容易內存清理。
然後重新運行,如果內存停止上升或減慢,您已經找到cuplrit,進入更深層次。
如果您在使用語句包裝完所有頂級調用之後對結果感到滿意,那麼可以在深入挖掘之前完成。(雖然你應該挖掘,只是爲了瞭解什麼是真的錯誤,當你不急時)
你確定*(如在*真的確定*)該服務正在進食內存? [解剖一個「內存泄漏」](http://stackoverflow.com/questions/104/anatomy-of-a-memory-leak)是調查原因的一個很好的起點。 –
在任務管理器中,內存正在增加。當它在3天后17K打開時,它的容量爲5GB。我能更確定嗎? – Exitos