堆内存问题

有一个WCF自托管服务,必须在99%的时间内工作。 有时我们会遇到一些像这样的内存问题:

内存泄漏

但在此问题之后,服务正常。 我们如何管理这个? 任何提示和要点,以提供强大的服务,将在不同的情况下生存,非常受欢迎。

我不太确定问题所在,但内存泄漏可能是一个原因。

所有代码都是托管的。 我们使用devArt的dotConnect for Oracle作为数据层库。

您假设所有代码都是托管的,但可能存在非托管部分。 但是,在使用它们之后,必须为所有一次性对象调用Dispose方法,一旦它们超出范围,就不要认为它们是正确处置的。 最佳做法是,不要在不调用Dispose方法的情况下让Disposable对象超出范围。 如果您将它们用作局部变量,则可以使用’using’语句。

DbConnection是一次性物品的一个很好的例子,请确保您处理所有连接(一次性物体)。

如果这是一个WCF问题(我不知道如何处理你的转储),我建议你激活WCF服务器端跟踪,并查看exception(如果有的话)(并编辑你的问题,以便我们可以进一步帮助您)。

这是一个解释如何执行此操作的链接:

如何启用WCF跟踪

您的服务行为是什么,尤其是ConcurrencyMode和InstanceContextMode。

如果您有多个ConcurrencyMode和InstanceContext设置为(PerCall或PerSession(默认)),如果您有大型DataStructures或未分配的资源,您可以定义运行问题。

如果您使用多个并发尝试InstanceContextMode Single [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,InstanceContextMode = InstanceContextMode.Single)]

你是100%没有你的依赖有非托管代码? 我已经看到了与此类似的事情,并且它发生了,因为我们正在释放内存,而另一个进程也会尝试在以后解除分配。