WCF Windows服务在每次调用后都不释放资源/内存

时间:2010-09-20 12:30:01

标签: windows-services memory-leaks wcf memory-management

我创建了在Windows服务上运行的WCF应用程序。它是使用Windows Installer安装的。我已按照以下文章中提到的程序进行了同样的操作。

http://msdn.microsoft.com/en-us/library/bb332338.aspx#msdnwcfhc_topic4

对于net.tcp协议,每个调用实例等,大多数WCF属性都是默认值。

服务的内存消耗在每次通话后不断增加,并且不会减少。最后它会抛出OutOfMemory消费。

应用程序返回非常繁重的基于字符串的数据使用memory-profiler,我发现内存仍然分配给字符串对象,并在调用期间增加。

根据我的理解字符串,托管对象应该在范围之外发布数据。

请告知我是否需要具体的其他配置/编码信息。

3 个答案:

答案 0 :(得分:0)

必须在代码中保留对这些字符串的引用。您是否可以使用您的探查器来跟踪保持字符串对象存活的引用?

答案 1 :(得分:0)

如果没有一些代码可以回答这个问题就很难了。您始终可以调用GC.Collect(GC.MaxGeneration)来强制进行垃圾回收,看看这是否会减少您的内存消耗。理想情况下,这只是临时代码,用于跟踪应用程序中发生的情况。如果强制垃圾收集不会减少内存消耗,那么必须通过静态成员变量或其他任何方式保留对字符串的引用:不知道代码是什么,任何理论都是在黑暗中拍摄

答案 2 :(得分:0)

在我的上下文中处理LOH(http://msdn.microsoft.com/en-us/magazine/cc534993.aspx)这个非常大的字符串的许多尝试失败之后,我已经创建了自定义类来处理它。

而不是将大字符串存储在单个对象中,而是将其存储为自定义对象中的小字符串集合。 .NET正确处理它而不会产生上述问题。

其他可行的解决方案是使用文件对象来存储大文件并将其作为文本阅读器访问。这样可以很好地保持应用程序的占用空间小。不幸的是,它不起作用,并且不允许访问文件位置。