堆内存问题

7

有一个WCF自托管服务,必须99%的时间正常工作。有时我们会遇到一些内存问题,如下图所示:

memory leaks

但是服务在出现这些问题后仍然像往常一样工作。我们该如何管理这个问题?非常欢迎任何关于创建健壮的服务、能够在不同异常情况下幸存的提示和建议。


你是否有纯管理代码,还是有非托管代码或交互操作? - Albin Sunnanbo
所有的代码都是经过管理的。我们使用devArt的dotConnect for Oracle作为数据层库。 - kseen
你为什么屏蔽了ASCII转储?你知道可以使用左侧的代码完全重建它吗? - Daniel
是的,我知道它可以被重建,但这是一种非常复杂和笨拙的方式。 - kseen
@kseen:你在开玩笑吧?SED(PIRCNOITDA(=SERDYL_S(5TSRDDA=SSEORDIL_S(=TSR - user707582
4个回答

3
我不确定问题出在哪里,但内存泄漏可能是一个原因。
所有代码都是托管的。我们使用devArt的dotConnect for Oracle作为数据层库。
你假设所有代码都是托管的,但可能有未托管的部分。然而,在使用完可处理对象后,必须调用Dispose方法,不要认为它们一旦超出范围就会被正确处理。最好的做法是,不要让可处理对象在没有调用其Dispose方法的情况下超出范围。如果您将它们用作局部变量,可以使用'using'语句。
DbConnection是可处理对象的一个很好的例子,请确保处理所有连接(可处理对象)。

2
+1,好建议。Oracle DAL需要Dispose,因为它们使用了非托管代码。这很遗憾,因为在应用程序中处理Oracle连接和命令通常是最耗时的操作(在我看来)。 - Jeremy Thompson

0

你确定你的所有依赖项都没有未经管理的代码吗?我曾经遇到过非常类似的情况,那是因为我们正在释放另一个进程稍后也会尝试释放的内存。


0
如果这是一个WCF问题(我不确定如何处理您的转储),我建议您激活WCF服务器端跟踪,并查看是否有任何异常(并编辑您的问题,以便我们可以进一步帮助您)。
以下是一个链接,讲述了如何进行此操作: 如何启用WCF跟踪

0

你的服务行为特别是 ConcurrencyMode 和 InstanceContextMode 是什么?

如果你将 ConcurrencyMode 设置为 Multiple,而 InstanceContext 设置为 PerCall 或者 PerSession(默认),那么如果你有大型数据结构或未释放的资源,你肯定会遇到问题。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接