C# - GC.GetTotalMemory()问题

时间:2011-09-17 15:01:56

标签: c# .net

我正在创建一个基于C#的Windows服务,该服务将持续数月运行24个月。我希望能够跟踪我的服务的一般内存使用情况。它不需要精确到字节。分配的一般金额就足够了。我将监视内存消耗的趋势。 GC.GetTotalMemory()是一种监控它的合适方法吗?

我知道性能监视器和计数器的使用。但是,此服务将在至少12个不同的服务器上运行。我不想在12个不同的服务器上跟踪PM。该服务将所有性能和内存使用信息从所有实例持久保存到中央数据库,以避免这种情况,并便于分析。

4 个答案:

答案 0 :(得分:5)

仅当它是纯粹的托管内存应用程序时。如果其中任何一个调用非托管代码,那么在那里分配的内存将永远不会在垃圾收集器中注册(除非有人记得呼叫GC.AddMemoryPressure)。

答案 1 :(得分:4)

GC.GetTotalMemory检索想要分配的内存量。它只知道托管组件分配的内存,除非你调用GC.AddMemoryPressure告诉它有关其他内存的分配。

通过阅读Process.WorkingSet64Process.VirtualMemory64以及Process类的其他此类属性,您可以更好地了解分配的实际内存量。只需致电Process.GetCurrentProcess,然后获得所需内容。

也就是说,使用性能计数器可能会更好。

答案 2 :(得分:3)

这不是您问题的直接答案,但是您的意图是让您的服务保持24x7全天候运行。

我会非常清楚堆碎片。有关说明,请参阅this article

答案 3 :(得分:2)

使用效果计数器。您可以将它们设置为登录到文件。

或者,您可以在代码中阅读性能计数器,并将数据保存到中央位置。