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

Windows services WCF Windows服务未在每次调用后释放资源/内存,windows-services,memory-leaks,wcf,memory-management,Windows Services,Memory Leaks,Wcf,Memory Management,我已经创建了在Windows服务上运行的WCF应用程序。它是使用Windows Installer安装的。我也遵循了下面文章中提到的程序 对于net.tcp协议、每个调用实例等,大多数WCF属性都保留为默认值 每次呼叫后,服务的内存消耗都会不断增加,而不会减少。最后,它抛弃了内存消耗 应用程序返回非常重的基于字符串的数据。使用内存分析器,我发现内存仍然分配给字符串对象,并在调用期间增加 据我所知,字符串是托管的,一旦超出范围,对象应该释放数据 如果特别需要任何其他配置/编码信息,请告诉我。代码

我已经创建了在Windows服务上运行的WCF应用程序。它是使用Windows Installer安装的。我也遵循了下面文章中提到的程序

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

每次呼叫后,服务的内存消耗都会不断增加,而不会减少。最后,它抛弃了内存消耗

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

据我所知,字符串是托管的,一旦超出范围,对象应该释放数据


如果特别需要任何其他配置/编码信息,请告诉我。

代码中必须保留对这些字符串的引用。你能用你的分析器来追踪那些使字符串对象保持活动状态的引用吗?

如果没有一些代码来查看,回答这个问题是非常困难的。您可以随时调用GC.Collect(GC.MaxGeneration)强制垃圾收集,看看这是否能减少内存消耗。理想情况下,这只是跟踪应用程序中发生的事情的临时代码。如果强制垃圾收集不能减少内存消耗,那么必须通过静态成员变量或其他方式保留对字符串的引用:不知道代码是什么,任何理论都是在多次尝试处理LOH()失败后的一次冒险,LOH()在我的上下文中是非常大的字符串,我已经创建了自定义类来处理它

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


worked for me的另一个可能的解决方案是使用file对象存储大文件,并作为文本读取器访问它。这可以很好地工作,并保持应用程序的占用空间很小。不幸的是,它不起作用,应用程序不允许访问文件位置。

使用memory pro filer,我发现许多对象仍在内存中,无法释放。即使字符串对象也没有被释放,尽管我认为它可能与此有关。我得出的结论是,若服务达到一定的内存限制,我需要重新启动它。你们不能发布什么类型的对象并没有被释放吗?是否有任何您可能不处理的一次性对象?请检查新添加的注释。当发生集合时,这些对象(包括字符串)将不被分配,除非有到根对象的特定可跟踪连接。对其中一个应该释放的字符串对象进行跟踪,以显示保持该对象活动的引用路径。See字符串和其他任何东西一样,只有在没有任何东西引用它们时才会被释放。如果您看到字符串没有被释放,这是一种症状,而不是问题所在。找出哪个对象将保留该字符串的实例,然后找出谁仍保留对该对象的引用。或者忽略探查器中的字符串,查看哪些类被泄漏。我已在perf mon中检查了我的代码中的大型对象LOH msdn.microsoft.com/en-us/magazine/cc534993.aspx,发现它们存在。搜索net时,我找不到任何合适的方法来处理LOH行为。我尝试了GC.Collect()和其他一些垃圾收集器方法,但最终没有结果。显然,我发现它与大型objcts LOH有关,无法正确处理。请检查新添加的注释。