【发布时间】:2014-04-30 08:20:00
【问题描述】:
我写了一个WCF (c#) Windows Service application,在我看来,Windows 服务正在泄漏内存。
根据 Windows,内存压力从 Windows 服务启动时从24 Gb 上升到屏幕截图时的44 Gb(稍后30 hours)
我们有两个问题;
- 我们尝试使用 ANTS Memory Profiler 模拟泄漏,并且我们 找不到问题。
- WCF 服务本身没有泄漏内存。内存使用量为
18 Gb(这与从开始时的内存压力相同 服务)。
我该如何调查这个问题?是什么导致了如此高的内存压力?
【问题讨论】:
-
"WCF 服务本身没有泄漏内存。"但显然,确实如此。你这句话是什么意思?你能拍个堆快照看看里面有什么吗?
-
您好 usr,根据 Windows 的说法,在屏幕截图时(30 小时后),从 Windows 服务启动开始,内存压力从 24 Gb 上升到 44 Gb。由于服务器只运行了我的 WCF 服务,所以只能是这个应用造成的。
-
您可以从服务器获取内存转储并“离线”分析它,即在 SciTech Memory profiler memprofiler.com 中,而不是重现问题。 ANTS afaik 不支持加载内存转储。
-
就个人而言,我会开始删除代码,直到它不再丢失内存。有三种可能性; a)WCF 中有一个错误,b)您正在设法保持指向应该但不能被垃圾收集的对象的链接,c)您正在创建不受管理的内存(例如通过 Marshal)而不是取消分配它。
-
我也遇到了麻烦。我的问题终于解决了。最大的问题是我对从托管 exe 传递到 WCF 服务的数据对象有一个共享引用。一旦我摆脱了它,我的大部分记忆问题就消失了。我做的另一件事也是让我的服务中的所有对象都是一次性的。这也有帮助。
标签: c# wcf memory-leaks