我在控制台应用程序中托管了WCF服务。我有ChannelFactory
来调用WCF的操作合同。
问题:每当我调用一个返回值的操作时,似乎返回的值在序列化时被服务缓存到某处。
我通过Windows 7下的任务管理器检查服务内存使用情况。当我调用一个什么都不返回的操作时,内存不会增加,但是当我调用一个返回数据的操作时,内存会增加并保持这种状态即使数据返回给客户端。
我的猜测是这是一个序列化缓存问题?!?
答案 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:
答案 2 :(得分:1)
使用这样的工具查看正在创建/收集的对象: http://memprofiler.com/
如果在每次调用后没有运行GC,我不会太担心 - 无论如何这都不会非常有效 - 垃圾收集器将在.NET框架确定对象足够老的时候运行被收集。如果内存开始变低,那么这种情况会更频繁地发生。