【问题标题】:Server is leaking memory; but process looks fine服务器正在泄漏内存;但过程看起来不错
【发布时间】:2014-04-30 08:20:00
【问题描述】:

我写了一个WCF (c#) Windows Service application,在我看来,Windows 服务正在泄漏内存。 根据 Windows,内存压力从 Windows 服务启动时从24 Gb 上升到屏幕截图时的44 Gb(稍后30 hours

我们有两个问题;

  1. 我们尝试使用 ANTS Memory Profiler 模拟泄漏,并且我们 找不到问题。
  2. 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


【解决方案1】:

在我们看来,这是预期的行为。我们从未将这种行为视为发展 机器的可用内存较少。只有当 92 % - 95 % 的内存是 “占用”垃圾收集是强制的。

我们查看此问题的原因是因为进程在一段时间后运行得更慢。

有趣的是: .NET application memory usage - high unused .NET and unmanaged memory and fragmentation

http://forum.memprofiler.com/viewtopic.php?f=2&t=4389

把这本书放在我的书架上: http://download.red-gate.com/ebooks/DotNet/Under_the_Hood_of_.NET_Management.pdf

谢谢大家,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 2011-02-18
    • 2011-12-05
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 2016-01-09
    相关资源
    最近更新 更多