我正在调试 ASP.NET Web 应用程序中的 OOM 问题。使用性能计数器,发现非托管空间存在问题。因此,我使用 Debugdiag 生成转储并从中创建内存压力分析报告。
概括:
oracommon10.dll 负责 270.16 MB 的未完成分配。
最大内存消耗函数:oracommon10!sktsfMalloc+c:270.16 MB 的未完成分配。
功能:oracommon10!sktsfMalloc+c
分配类型 C/C++ 运行时分配
分配计数 455 个分配
分配大小 270.16 MB
泄漏概率 95%
从下面的调用堆栈示例(我在最顶级的 .Net 调用之后包含了本机调用),有人可以帮助我理解这一点吗?我假设这可能是 Oracle 连接之一未关闭的问题。
Function Source Destination
oracommon10!sktsfMalloc+c msvcr71!malloc
orageneric10!kghaex+5ef
ntdll!ZwSetEventBoostPriority+c
ntdll!RtlpUnWaitCriticalSection+22
OraClient10!kpuinit0+a5c
OraClient10!kpuenvcr+ea
OraClient10!OCIEnvCreate+3d
oci!OCIEnvCreate+2a
0x1CE2A1F
mscorwks+3ad8
System.Data.OracleClient.OciHandle..ctor(System.Data.OracleClient.OciHandle, HTYPE, MODE, HANDLEFLAG)
System_Data_OracleClient_ni+e1d38
System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(System.Data.Common.DbConnection, System.Data.ProviderBase.DbConnectionPool, System.Data.Common.DbConnectionOptions)
System.Data.OracleClient.OracleConnection.Open()
Microsoft.Practices.EnterpriseLibrary.Data.Database.GetNewOpenConnection()
Microsoft.Practices.EnterpriseLibrary.Data.Database.GetOpenConnection(Boolean)
Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteReader(System.Data.Common.DbCommand)
Microsoft.Practices.EnterpriseLibrary.Data.Oracle.OracleDatabase.ExecuteReader(System.Data.Common.DbCommand)
MyDAL.MyMethod(System.String, System.String, Int32)