2011-09-28 100 views
7

有一个WCF自我托管服务必须工作99%的时间。有时候,我们得到了一些麻烦的内存这样的:堆内存问题

memory leaks

但服务后问题的工作如常。我们如何处理这个问题?任何提示和要点,使强大的服务,将生存在不同的情况下,是非常受欢迎的。

+0

您是否拥有纯托管代码,或者您是否拥有非托管代码或互操作代码? –

+0

所有代码都被管理。我们使用[devArt的dotConnect for Oracle](http://www.devart.com/dotconnect/oracle/)作为数据层库。 – kseen

+0

你为什么要禁用ASCII转储?你知道它可以使用左边的代码完全重建吗? – Dani

回答

3

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

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

您假定所有代码都被管理,但可能存在非托管部分。但是,在使用它们之后,必须调用Dispose方法来处理所有可丢弃对象,不要认为一旦它们超出范围就会被正确处置。最佳做法是,不要让Disposable对象超出范围而不调用其Dispose方法。如果您将它们用作局部变量,则可以使用'using'语句。

DbConnection是一次性对象的一个​​很好的例子,确保你处理所有的连接(一次性对象)。

+2

+1,很好的建议,Oracle DAL确实需要Dispose,因为它们使用了非托管代码,因为处置Oracle连接和命令通常是最耗时的操作一个应用程序(IMHE) –

0

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

下面是解释如何做到这一点的链接:

How to enable WCF tracing

0

什么是您的服务行为特别ConcurrencyMode和InstanceContextMode。

如果将Multiple作为ConcurrencyMode和InstanceContext设置为(PerCall或PerSession(默认值)),那么如果您有大型DataStructures或未设置的资源,则可以定义问题。

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

0

你是你依赖的100%,无有非托管代码?我看到了与这种情况非常相似的事情,而这种情况发生是因为我们正在释放内存,以致另一个进程稍后也会尝试释放内存。