2011-09-17 41 views
6

我正在創建一個基於C#的Windows服務,它將在幾個月內全天候運行24x7。我希望能夠跟蹤我的服務的一般內存使用情況。它不需要精確到字節。一般的分配數量就足夠了。我將監視內存消耗趨勢。 GC.GetTotalMemory()是一種適當的方式來監視這個嗎?C# - GC.GetTotalMemory()問題

我知道性能監視器和使用計數器。但是,該服務將在至少12臺不同的服務器上運行。我不想在12臺不同的服務器上跟蹤PM。該服務將從所有實例中將所有性能和內存使用信息保存到中央數據庫中,以避免這種情況,並且便於分析。

回答

5

只有它是純粹的託管內存應用程序。如果其中任何一個正在調用非託管代碼,那麼分配的內存將永遠不會在垃圾收集器中註冊(除非有人記得致電GC.AddMemoryPressure)。

+0

謝謝。它是一個純粹的管理應用程序。 –

2

使用性能計數器。您可以將它們設置爲登錄到文件。

或者,您可以讀取代碼中的性能計數器,並將數據保存到中央位置。

+0

+1表示Perf Counters,因爲它們還允許您監視一百萬個其他事物,例如CPU和I/O Usage,這些可能會隨着時間的推移而成爲瓶頸。 –

+0

@TheCodeKing - 通常我會,實際上有。但是,此服務將在至少12臺不同的服務器上運行。我不想在12臺不同的服務器上跟蹤PM。我將所有性能和內存使用信息從所有實例持久保存到中央數據庫以避免這種情況。 –

+1

您可以連接到遠程計算機上的性能計數器,因此在影響您可以集中管理,瞭解它是否仍然不合適。您當然也可以在代碼中閱讀這些內容。 – TheCodeKing

3

GC.GetTotalMemory檢索想要分配的內存量。它只知道由託管組件分配的內存,除非您致電GC.AddMemoryPressure告訴它關於分配的其他內存。

通過閱讀Process.WorkingSet64Process.VirtualMemory64以及Process類的其他此類屬性,可以更好地瞭解分配的內存量。只需撥打Process.GetCurrentProcess,然後獲得所需。

也就是說,使用性能計數器可能會更好。

3

這不是對你的問題的直接回答,而是你的意圖促使你的服務每月24x7運行。

我會非常瞭解堆碎片。請參閱this article以獲得解釋

+0

謝謝。該文章看起來很有用。 –

+0

對於那些使用統一/邊注的人更重要 – Fawar