C#Windows窗体应用程序中奇怪的内存使用模式

时间:2011-07-22 14:48:17

标签: c# oracle memory-leaks odp.net perfmon

我试图了解用C#编写的应用程序中发生了什么。以下是从性能监视器中获取的几张图像。所有堆中的蓝线都是#Bytes。绿线是大对象堆大小。我启动应用程序并登录。应用程序保持空闲状态。第一张图显示LOH由于某种原因而增加然后下降。模式非常清晰。这种行为的原因是什么?

enter image description here

更多。我使用Oracle数据库通过ODP.NET从A(见下图)开始进行一些繁重的处理。之后,应用程序再次保持闲置状态。 LOH不会下降。相反,它由于某种原因不断增加。请注意,应用程序处于空闲状它只是在我的桌面上打开。我甚至没有与它互动。

enter image description here

内存不断增加(每张图片代表1:15:00)。

enter image description here

超过2小时后突然降低,然后再次开始增加/减少(见下文),如第一张图像中所示。应用程序始终处于空闲状态。到底是怎么回事?这是内存泄漏吗?我不这么认为。我们对该应用进行了分析,找不到任何内容。此外,LOH增加没有任何活动。没有与Oracle数据库的开放连接。 ODP.NET可以成为罪魁祸首吗?

enter image description here

1 个答案:

答案 0 :(得分:0)

问题肯定是由于ODP.NET。如果我禁用连接池,则问题不会显现。对于每个连接,ODP.NET似乎创建了2个线程并且间隔为3分钟(如图中所示),ODP.NET会进行一些内务处理但由于某种原因会分配不立即释放的内存。

很容易重现。只需创建一个简单的应用程序,按下按钮时,将打开与Oracle数据库的连接,并执行存储过程。您会注意到第一张图像的图案。其他图像的模式是由应用程序创建的连接数。