2011-10-12 75 views
2

的极端发展我正在表现出一些非常奇特的问题的应用程序。它运行在2.5小时左右,然后突然非托管内存开始增长,并迅速增长。在大约半个小时左右的时间里,应用程序崩溃。.NET应用程序的经验突然非托管内存

的应用程序未使用任何非托管的DLL。它正在与外部应用程序通信。它使用套接字(通过Stream使用)并通过WCF流​​进行读取。

我与蚂蚁异形它。非托管内存利用率的突然变化非常惊人;它永远保持完全平坦,然后突然开始上升,并以稳定的速度继续这样做,直到应用程序失败。托管内存中没有任何内容似乎不合适。

既然我没有故意使用非托管代码,这是很难牵制在泄漏的来源。蚂蚁没有帮助。当它从一开始就不是一个稳定的增长时,很难清除代码中的问题(应用程序一直处于空闲状态,尽管它每秒通过具有非常少量数据的套接字来ping服务器一次)。

再次重申,应用程序和服务器都在此期间,两个空闲;这是在独立的测试系统上运行(包括服务器和客户端)。客户是泄漏的客户。

+1

这可能有助于http://stackoverflow.com/questions/1180649/how-to-find-dispose-and-memory-issues-c – hatchet

+0

你是否能够缩小到一个特定的页面或类? –

+0

出于好奇,它生长的速度有多快?它的增长速度大约是每秒*非常少量的数据*的速度吗? –

回答

3

您可能需要使用DebugDiag资料监视内存泄漏和提供资料,被分配什么,有多少,以及什么叫堆栈。总之:

进程已经启动(或重新启动)之后不久,做到以下几点:

  1. 打开DebugDiag资料。
  2. 取消向导。
  3. 转到“进程”选项卡。
  4. 右键单击所需的过程。
  5. 选择显示器用于泄漏。
  6. 单击确定。

处理后已经运行了一段时间,内存问题是显而易见的:

  1. 转到DebugDiag资料
  2. 如果不是仍然打开,取消了向导。
  3. 转到“进程”选项卡。
  4. 右键单击与部件#1相同的进程。
  5. 选择Create Full Userdump。
  6. 记下转储的位置。

另外,如果进程重新启动的内存转储被捕获之前,泄漏监测将被重新启用。

一旦你的转储:

  1. 转到DebugDiag资料。
  2. 转到“高级分析”选项卡。
  3. 向上选择“MemoryAnalysis.asp”脚本。
  4. 单击底部的“添加数据文件”并选择先前创建的转储。
  5. 单击“开始分析”并查看结果。

一旦你有了这些信息,你应该能够确定内存分配的来源,并希望能够解决问题的原因。

您可以从以下资源找到更多的信息:

0

我们终于发现了问题。事实证明,我们之间有一个套接字连接,在空闲阶段,我们会发送一个KeepAlive数据包,以防止侦听器自动断开连接。但是,在闲置一段时间后,通过WCF的一些特殊超时,套接字被关闭了服务器端。

所以基本上每次DispatchTimer被触发时,keep-alive数据包都会被写入套接字,但显然它会被阻塞。这不会阻止下一个DispatchTimer执行完全相同的操作。虽然它看起来像是更大的东西,但这些小包快速建立起来并且吃掉了所有非托管内存,我推测这个套接字的缓冲区(我相信我们使用NetworkStream进行连接)。随着逻辑的几次转变,问题就消失了。

感谢所有的输入,但是非常感谢!

相关问题