有一个WCF自托管服务必须在99%的时间内工作。有时我们会遇到这样的记忆问题:
但在此问题之后,服务正常。我们如何管理这个?任何提示和要点,以提供强大的服务,将在不同的情况下生存,非常受欢迎。
答案 0 :(得分:3)
我不太确定问题所在,但内存泄漏可能是一个原因。
管理所有代码。我们使用devArt的dotConnect for Oracle作为 数据层库。
您假设所有代码都已管理,但可能存在非托管部分。但是,在使用它们之后,必须为所有一次性对象调用Dispose方法,一旦它们超出范围,就不要认为它们是正确处置的。最好的做法是,不要在不调用Dispose方法的情况下让Disposable对象超出范围。如果您将它们用作局部变量,则可以使用'using'语句。
DbConnection是一次性物品的一个很好的例子,请确保丢弃所有连接(一次性物体)。
答案 1 :(得分:0)
如果是WCF问题(我不知道如何处理你的转储),我建议你激活WCF服务器端跟踪,如果有的话可以查看异常(并编辑你的问题,所以我们可以进一步帮助你。)
以下是解释如何执行此操作的链接:
答案 2 :(得分:0)
您的服务行为是什么,尤其是ConcurrencyMode和InstanceContextMode。
如果你有多个ConcurrencyMode和InstanceContext设置为(PerCall,或PerSession(默认)),如果你有大型DataStructures或未分配的资源,你可以定义遇到问题。
如果您使用多个并发尝试InstanceContextMode Single [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,InstanceContextMode = InstanceContextMode.Single)]
答案 3 :(得分:0)
您是否100%没有任何依赖项具有非托管代码?我已经看到了与此非常类似的事情,并且它发生了,因为我们正在释放内存,而另一个进程也会尝试在以后解除分配。