首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WCF序列化和缓存

WCF序列化和缓存
EN

Stack Overflow用户
提问于 2011-06-13 13:14:35
回答 3查看 946关注 0票数 3

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

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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.Collect方法。在几乎所有情况下,您都不必调用此方法,因为垃圾收集器持续运行。此方法主要用于特殊情况和测试。

很可能是在堆中分配对象,但它们不是GC'd,因为GC看不到运行的理由(堆生成中仍然有开放空间,也没有理由花时间清除它)。

但是,如果您可以一次又一次地重复WCF调用,并最终得到内存不足的异常,那么这将表明在某个地方保存引用确实有问题。在这种情况下,我会使用内存分析器来确定所持有的是什么,以及通过什么。

编辑2:

还请参阅以下线程:C# Thread not releasing memory

票数 2
EN

Stack Overflow用户

发布于 2011-06-13 13:25:07

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

票数 3
EN

Stack Overflow用户

发布于 2011-06-13 13:43:05

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

如果在每次调用之后不运行GC,我不会太担心--这无论如何也不是很有效--垃圾收集器将在.NET框架确定对象已经足够老到可以被收集时运行。如果内存开始减少,那么这种情况就会发生得更频繁。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6330886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档