【问题标题】:WCF Serialization and CachingWCF 序列化和缓存
【发布时间】:2011-09-13 22:12:06
【问题描述】:

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

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

我在windows 7下通过任务管理器查看服务内存使用情况。当我调用一个什么都不返回的操作时,内存没有增加,但是当我调用一个返回数据的操作时,内存增加了,一直这样即使在数据返回给客户端之后。

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

【问题讨论】:

  • 尝试运行一些内存分析并查看哪些对象保留在内存中。您使用显式缓存还是静态变量来保存数据?

标签: c# wcf channelfactory


【解决方案1】:

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

【讨论】:

  • GC 应该什么时候运行?我有一个堆栈溢出异常,但 GC 仍然没有运行。无论如何我可以手动释放内存吗?或者调用 GC?
  • @scatman - 如果你有一个 StackOverflow 异常,那么你还有另一个问题。这通常表明某种递归没有完成,例如:public void MethodA() { MethodB(); } public void MethodB() { MethodA(); } 调用其中一个函数会导致无限循环,并且只要调用堆栈太深,最终就会引发 StackOverflowException。
  • @scatman - 您可以通过调用 System.GC.Collect() 手动告诉 GC 运行,如下所述:msdn.microsoft.com/en-us/library/system.gc.collect.aspx 但是这可能对您的 StackOverflowException 没有帮助。不过,它可能有助于确定对象引用是否会阻止垃圾收集。
【解决方案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# Thread not releasing memory

【讨论】:

  • 是的,我已经做了你提到的。每个请求都会调用该方法。并且每次内存增加并且永远不会释放!
  • 哦,好吧,也许我看错了你的问题。我以为你的意思是相同的响应被一遍又一遍地发送给他的客户端,就好像回复被缓存并且方法没有重新运行一样。我将编辑我的答案...
  • 您不能在操作中调用collection,因为对象仍在使用中。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    相关资源
    最近更新 更多