3

我有一个托管在控制台应用程序中的 WCF 服务。我有一个ChannelFactory调用 WCF 的操作合同。

问题:每当我调用返回值的操作时,似乎返回的值在序列化时被服务缓存在某处。

我正在通过Windows 7下的任务管理器检查服务内存使用情况。当我调用一个不返回任何内容的操作时,内存不会增加,但是当我调用一个返回数据的操作时,内存会增加并且即使在数据返回给客户端。

我的猜测是这是一个序列化缓存问题?!?

4

3 回答 3

3

听起来更像是垃圾收集器还没有运行,因此内存没有释放。此外,当在控制台应用程序中托管 WCF 服务时,GC会在工作站模式下运行,在这种情况下效率会降低。

于 2011-06-13T13:25:07.867 回答
2

内存可能会一直增加,直到 GC 运行,这与数据返回到客户端的时间不对应。

您是否尝试过向服务方法添加断点或某种类型的日志记录,以确保在每个请求上都调用该方法?我不认为 WCF 自己做任何缓存。至少,我从来没有在我的应用程序中使用它。


编辑:

内存将一直使用,直到垃圾收集器运行。如果您的进程在其堆中仍然有足够的可用空间,那么确实没有理由让 GC 运行。

根据 MSDN:http: //msdn.microsoft.com/en-us/library/ee787088.aspx#conditions_for_a_garbage_collection

当下列条件之一为真时,就会发生垃圾收集:

  • 系统物理内存不足。

  • 托管堆上分配的对象使用的内存超过了可接受的阈值。这意味着已超过托管堆上可接受的内存使用量的阈值。随着流程的运行,此阈值会不断调整。

  • GC.Collect 方法被调用。在几乎所有情况下,您都不必调用此方法,因为垃圾收集器会持续运行。此方法主要用于特殊情况和测试。

您很可能在堆中分配对象,但它们没有被 GC 处理,因为 GC 认为没有理由运行(堆生成中仍然有开放空间,没有理由花时间清理它)。

但是,如果您可以一遍又一遍地重复您的 WCF 调用并最终获得内存不足异常,那么这将表明您确实在某处保存引用存在问题。在这种情况下,我会使用内存分析器来确定要保留的内容以及保留的内容。


编辑#2:

另请参阅此线程: C# 线程未释放内存

于 2011-06-13T13:29:45.850 回答
1

使用这样的工具来查看正在创建/收集的对象:http: //memprofiler.com/

如果每次调用后没有运行 GC,我不会太担心 - 无论如何这不会非常有效 - 垃圾收集器将在 .NET 框架确定对象足够旧可以收集时运行。如果内存开始不足,那么这种情况会更频繁地发生。

于 2011-06-13T13:43:05.043 回答