我在控制台应用程序中托管了一个WCF服务。我有一个ChannelFactory来调用WCF的运营合同。
问题:每当我调用返回值的操作时,似乎在服务序列化时将返回的值缓存在某个地方。
我正在通过windows 7下的任务管理器检查服务内存的使用情况。当我调用一个不返回任何内容的操作时,内存不会增加,但是当我调用一个返回数据的操作时,即使数据返回到客户端,内存也会增加,并且保持这种状态。
我猜这是一个序列化缓存问题吗?!?
发布于 2011-06-13 13:29:45
在GC运行之前,内存可能会继续增加,这与数据返回客户端时不相对应。
您是否尝试过向服务方法添加断点或日志记录,以确保每个请求都调用了该方法?我不认为WCF单独进行任何缓存;至少,在我的应用程序中,它从未使用过缓存。
编辑:
内存将继续使用,直到垃圾收集器运行为止。如果您的进程堆中仍然有足够的空闲空间,那么GC实际上没有理由运行。
根据MSDN:http://msdn.microsoft.com/en-us/library/ee787088.aspx#conditions_for_a_garbage_collection
当下列条件之一为真时,将发生
垃圾回收:
很可能是在堆中分配对象,但它们不是GC'd,因为GC看不到运行的理由(堆生成中仍然有开放空间,也没有理由花时间清除它)。
但是,如果您可以一次又一次地重复WCF调用,并最终得到内存不足的异常,那么这将表明在某个地方保存引用确实有问题。在这种情况下,我会使用内存分析器来确定所持有的是什么,以及通过什么。
编辑2:
还请参阅以下线程:C# Thread not releasing memory
发布于 2011-06-13 13:25:07
听起来更像是垃圾收集器还没有运行,因此内存没有释放。此外,当在控制台应用程序中托管WCF服务时,GC运行在工作站模式下,在这种情况下可能不太有效。
发布于 2011-06-13 13:43:05
使用这样的工具来查看正在创建/收集哪些对象:http://memprofiler.com/
如果在每次调用之后不运行GC,我不会太担心--这无论如何也不是很有效--垃圾收集器将在.NET框架确定对象已经足够老到可以被收集时运行。如果内存开始减少,那么这种情况就会发生得更频繁。
https://stackoverflow.com/questions/6330886
复制相似问题