【发布时间】:2011-02-18 14:10:27
【问题描述】:
我在控制台应用程序中托管了一个非常小的 wcf 服务。
[ServiceContract]
public interface IService1
{
[OperationContract]
void DoService();
}
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]
public class Service1 : IService1
{
public void DoService()
{
}
}
它被称为
using (ServiceReference1.Service1Client client = new ServiceReference1.Service1Client())
{
client.DoService(new DoServiceRequest());
client.Close();
}
请记住,服务是在 basicHttpBindings 上发布的。
问题
现在,当我在 1000 次循环中执行上述客户端代码时,我发现“所有堆字节”和“私有字节”性能计数器之间存在很大差异(我使用了 .net 内存分析器)。经过调查,我发现有些物品没有妥善处理 以下是这些对象的列表(找到了 1000 个未处理的实例 --> 等于客户端调用)
(它们的命名空间都是 System.ServiceModel.Channels)
HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream
BodyWriterMessage
BufferedMessage
HttpRequestContext.ListenerHttpContext.ListenerContextHttpInput.ListenerContextInputStream
HttpRequestContext.ListenerHttpContext
问题 为什么我们有很多未处理的对象以及如何控制它们。
请帮忙
【问题讨论】:
-
对我来说似乎是系统库泄漏。客户端(如在用户编写的服务中)代码不会触及这些缓冲区和流,并且看起来 WCF 没有处理它们。
-
Mabushar:你有运气吗?我似乎遇到了类似的问题。
-
@bugfixr 对不起兄弟我今天注意到你的消息,我不记得我是否能够摆脱那些但我记得的一件事是我从框架 3.5 转移到框架 4.0,它帮助部分或全部我不记得了,但它以某种方式帮助了我。抱歉回复晚了。
标签: wcf .net-3.5 memory-leaks