【发布时间】:2010-03-24 12:15:50
【问题描述】:
我知道我的问题没有简单的答案,但我希望能提供想法、指南或 一些值得一看的东西
我有一个不断抛出 OutOfMemoryException 的网络 Windows 服务。 该服务有两个针对 x86 和 x64 Windows 的构建。但是在 x64 上它消耗更多 记忆。我尝试使用各种内存分析器对其进行分析。但我不知道问题是什么。诊断 - 服务会在 3 到 12 小时后消耗大量 VMSize 并导致应用程序崩溃。行为相当随机 - 没有可观察到的崩溃场景模式。
我还尝试查看性能计数器 (perfmon.exe)。我能看到的是 堆大小正在增长,%GC 时间平均为 19%。此外,内存分配与 %CPU 时间相关。
我的应用程序有线程和锁定对象、数据库连接和 WCF 接口。 我试图解决的一般问题:
仅仅是GC不够快吗 到 GC 对象或一些非托管 (windows) 对象正在消耗 内存?
查看列表中的第一个应用 http://s45.radikal.ru/i109/1003/af/92a389d189e8.jpg http://s45.radikal.ru/i109/1003/af/92a389d189e8.jpg
带有性能计数器视图的图片链接 http://s006.radikal.ru/i215/1003/0b/ddb3d6c80809.jpg
【问题讨论】:
-
在我看来你有一些没有释放的对象(内存泄漏),或者你的 CPU 工作太多以至于框架决定不运行垃圾收集器。另请查看 MSDN 上垃圾收集器的延迟模式 - msdn.microsoft.com/en-us/library/bb384202.aspx。到目前为止,您使用过哪个内存分析器?
-
你是否从数据库中查询了大量数据?
-
在使用像memprofiler.com 这样的内存分析器时,您无需等待内存不足错误,您可以在泄漏失控之前看到泄漏。在这些情况下,分析器不应崩溃。
-
@Captain Comic:如果要排除由于处理器忙而导致GC没有运行,请在关键位置或计时器中放入GC.Collect()强制收集。如果内存仍然增加,则说明您有未释放的对象。
-
发生未处理的异常 OutOfIdeasException...
标签: c# .net profiling out-of-memory