WCF序列化和缓存

时间:2011-06-13 13:14:36

标签: c# wcf channelfactory

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

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

我通过Windows 7下的任务管理器检查服务内存使用情况。当我调用一个什么都不返回的操作时,内存不会增加,但是当我调用一个返回数据的操作时,内存会增加并保持这种状态即使数据返回给客户端。

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

在GC运行之前,内存可能会保持增加,这与数据返回客户端时无关。

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


编辑:

在垃圾收集器运行之前,内存将一直处于使用状态。如果你的进程的堆中仍有足够的可用空间,那么GC就没有理由运行。

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

  

当其中一个垃圾收集发生时   满足以下条件:

     
      
  • 系统物理内存较低。

  •   
  • 托管堆上已分配对象使用的内存   超过可接受的门槛。   这意味着一个门槛   可接受的内存使用情况   在托管堆上超出了。这个   阈值不断调整为   该过程运行。

  •   
  • 调用GC.Collect方法。在几乎所有情况下,你都没有   调用这个方法,因为   垃圾收集器不断运行。   此方法主要用于   独特的情况和测试。

  •   

您可能正在堆中分配对象,但它们不是GC,因为GC没有理由运行(堆生成中仍有开放空间,没有理由花时间清除它出)。

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


编辑#2:

另见此主题:C# Thread not releasing memory

答案 2 :(得分:1)

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

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